我正在尝试在 Python 中更好地使用 ReGex,并且我正在尝试找出如何隔离某些文本中的特定子字符串。我有一些文本,该文本可能类似于以下任意文本:
possible_strings = [
"some text (and words) more text (and words)",
"textrighthere(with some more)",
"little trickier (this time) with (all of (the)(values))"
]
对于每个字符串,尽管我不知道其中包含什么,但我知道它总是以括号中的一些信息结尾。包括像 #3 这样的例子,其中最后一对括号中有括号。
如何使用
re
/ReGex 将文本仅隔离在最后一对括号内?所以在前面的例子中,我希望输出是:
output = [
"and words",
"with some more",
"all of (the)(values)"
]
任何提示或帮助将不胜感激!
在 Python 中,您可以使用
regex
模块,因为它支持递归:
import regex
pat = r'(\((?:[^()]|(?1))*\))$'
regex.findall(pat, '\n'.join(possible_strings), regex.M)
['(and words)', '(with some more)', '(all of (the)(values))']
对于初学者来说,正则表达式可能相当复杂。 单击此处查看说明和示例
一点解释:
( # 1st Capturing Group
\( # matches the character (
(?:#Non-capturing group
[^()] # 1st Alternative Match a single character not present in the character class
| # or
(?1) #2nd Alternative matches the expression defined in the 1st capture group recursively
) # closes capturing group
* # matches zero or more times
\) #matches the character )
$ asserts position at the end of a line
对于前两个,开始匹配左括号,可以是以下任意一个:
"some text (and words) more text (and words)"
^ ^
后跟任何不是左括号的内容:
"some text (and words) more text (and words)"
^^^^^^^^^^^^^^^^^^^^^^X^^^^^^^^^^^
|- starting at the first ( hit
another ( which isn't allowed.
后跟行尾。只有最后一个 () 适合“不再(直到行尾”。
>>> import re
>>> re.findall('\([^(]+\)$', "some text (and words) more text (and words)")
['(and words)']
RegEx 不太适合你的第三个例子;没有简单的方法来配对括号,您可能必须安装并使用不同的正则表达式引擎才能获得嵌套结构支持。另请参阅