[英]Python regex match between characters
我在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] ']
对于我的一生,我无法理解这种行为。 任何帮助,将不胜感激。
谢谢!
你可以做:
>>> s = "blah [in brackets] stuff"
>>> re.findall(r'\b\w+\s*\w+\b', s)
['blah', 'in brackets', 'stuff']
对于那些感兴趣的人,这是我最终获得的成功的正则表达式。 某处可能有一个更优雅的解决方案,但这可行:
>>> 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']
如果您正在寻找一种简便的方法来进行此操作,请使用此方法。 注意:我将str替换为字符串,因为“ str”是python的内置函数。
import re
string = "blah [in brackets] stuff"
f = re.findall(r'\w+\w', string)
print(f)
输出:['blah','放在括号中,'stuff']
到目前为止,答案没有考虑到括号内可能有两个以上的单词,甚至一个单词。 以下正则表达式将在方括号和方括号的任何前导或尾随空白处分割。 如果字符串中包含更多括号内容,它也将起作用。
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.']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.