字符之间的Python正则表达式匹配
Posted
技术标签:
【中文标题】字符之间的Python正则表达式匹配【英文标题】:Python regex match between characters 【发布时间】:2016-09-02 22:01:37 【问题描述】:我在 python 中做一个非常简单的正则表达式,当我使用“或”运算符时看到一些奇怪的行为。
我正在尝试解析以下内容:
>> str = "blah [in brackets] stuff"
让它返回:
>> ['blah', 'in brackets', 'stuff']
为了匹配括号之间的文本,我使用了向后看和向前看,即:
>> '(?<=\[).*?(?=\])'
如果单独使用,它确实会捕获括号中的文本:
>> re.findall( '(?<=\[).*?(?=\])' , str )
>> ['in brackets']
但是当我结合 or 运算符来解析空格之间的字符串时,括号匹配会以某种方式分解:
>> [x for x in re.findall( '(?<=\[).*?(?=\])|.*?[, ]' , str ) if x!=' ' ]
>> ['blah', '[in ', 'brackets] ']
对于我的生活,我无法理解这种行为。任何帮助将不胜感激。
谢谢!
【问题讨论】:
这可能会有所帮助 - regex101.com/r/xM7sK0/1 - 在左侧,您可以进入调试器,它将解释它如何匹配它所做的事情。 谢谢,真的很有用。 问题是正则表达式的第二半也匹配括号。在第一个匹配(“blah”)之后,剩余的文本是[in brackets] stuff
。正则表达式的前半部分在此处不匹配,因为向后查找没有找到左括号。所以正则表达式的第二部分再次匹配并找到文本“[in”。
啊,我明白了。谢谢你!
【参考方案1】:
你可以这样做:
>>> s = "blah [in brackets] stuff"
>>> re.findall(r'\b\w+\s*\w+\b', s)
['blah', 'in brackets', 'stuff']
【讨论】:
谢谢!这是一个很好的解决方案。我仍然有兴趣了解为什么我的不起作用..在我的脑海中逐步通过它是有道理的:尝试匹配括号之间的内容,如果没有,则匹配空格前面的内容。对我来说, or 运算符的引入打破了括号匹配是没有意义的。有什么想法吗?【参考方案2】:对于那些感兴趣的人,这是我最终使用的成功的正则表达式。某处可能有更优雅的解决方案,但这可行:
>>> s = "blah 2.0 stuff 1 1 0 [in brackets] more stuff [1]"
>>> brackets_re = '(?<=\[).*?(?=\])'
>>> space_re = '[-\.\w]+(?= )'
>>> my_re = brackets_re + '|' + space_re
>>> re.findall(my_re, s)
['blah', '2.0', 'stuff', '1', '1', '0', 'in brackets', 'more', 'stuff', '1']
【讨论】:
【参考方案3】:如果您正在寻找一种简单的方法来执行此操作,请使用此方法。 注意:我用字符串替换了str,因为'str'是python的内置函数。
import re
string = "blah [in brackets] stuff"
f = re.findall(r'\w+\w', string)
print(f)
输出:['blah', 'in括号', 'stuff']
【讨论】:
【参考方案4】:到目前为止的答案没有考虑到括号内可能有两个以上的单词,甚至是一个单词。以下正则表达式将拆分括号和括号的任何前导或尾随空格。如果字符串中有更多括号内的内容,它也将起作用。
s = "blah [in brackets] stuff"
s = re.split(r'\s*\[|\]\s*', s) # note the 'or' operator is used and literal opening and closing brackets '\[' and '\]'
print(s)
输出:['blah', 'in brackets', 'stuff']
还有一个例子,使用括号内不同数量的单词并使用多组括号的字符串:
s = "blah [in brackets] stuff [three words here] more stuff [one-word] stuff [a digit 1!] stuff."
s = re.split(r'\s*\[|\]\s*', s)
print (s)
输出:['blah', 'in brackets', 'stuff', 'three words here', 'more stuff', 'one-word', 'stuff', 'a digit 1!', 'stuff.']
【讨论】:
我真的很喜欢你的解决方案。通过将它们与括号放在一个组中来合并其他分隔符也很容易。唯一的问题是它不会在括号外拆分多个单词,即它返回 'more stuff' 而不是 ['more', 'stuff']。以上是关于字符之间的Python正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章