字符之间的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正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

Python正则表达式初识

通过Python中的正则表达式优化在两个列表之间查找匹配子字符串

Python 正则表达式匹配两个字符之间的字符

C正则表达式,匹配两个字符串之间的内容

Python正则表达式

python:正则表达式