正则表达式获取括号外的所有文本

2024-06-01 10:34:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用正则表达式获取括号外的任何文本。

示例字符串

Josie Smith [3996 COLLEGE AVENUE, SOMETOWN, MD 21003]Mugsy Dog Smith [2560 OAK ST, GLENMEADE, WI 14098]

我能成功地用以下方法获取方括号内的文本:

addrs = re.findall(r"\[(.*?)\]", example_str)
print addrs
[u'3996 COLLEGE AVENUE, SOMETOWN, MD 21003',u'2560 OAK ST, GLENMEADE, WI 14098']    

但我在方括号外找不到任何东西。我试过如下方法:

names = re.findall(r"(.*?)\[.*\]+", example_str)

但那只找到名字:

print names
[u'Josie Smith ']

到目前为止,我只看到一个字符串包含一到两个name [address]组合,但我假设一个字符串中可能有任意数量的组合。


Tags: 方法字符串文本mdsmithstwi方括号
3条回答

如果要使用regex并仍然处理嵌套括号,可以使用:

import re
expr = re.compile("(?:^|])([^[\]]+)(?:\[|$)")

print(expr.findall("myexpr[skip this[and this]]another[and skip that too]"))

这将产生['myexpr', 'another']

其思想是匹配字符串开头或]与字符串结尾或[之间的任何内容。

如果没有嵌套的括号,可以执行以下操作:

re.findall(r'(.*?)\[.*?\]', example_str)

然而,你甚至不需要一个正则表达式在这里。只需在括号中分开:

(s.split(']')[-1] for s in example_str.split('['))

你尝试失败的唯一原因是:

re.findall(r"(.*?)\[.*\]+", example_str)

…是在括号内进行非贪婪匹配,这意味着它捕获了从第一个开放括号到最后一个闭括号的所有内容,而不是只捕获第一对括号。


而且,结尾的+似乎是错误的。如果你有'abc [def][ghi] jkl[mno]',你想回去['abc ', '', ' jkl'],还是['abc ', ' jkl']?如果是前者,则不要添加+。如果是后者,那么您需要将整个括号模式放入一个非捕获组:r'(.*?)(?:\[.*?\])+


如果最后一个括号后面可能还有其他文本,split方法将工作正常,或者您可以使用re.split而不是re.findall…但是如果您想调整原始regex以使用它,则可以。

在英语中,你想要的是在字符串末尾的括号括起来的子字符串之前的任何(非贪婪的)子字符串,对吧?

所以,您需要在\[.*?\]$之间进行交替。当然,你需要对它进行分组才能写出替换,而且你不想捕获这个组。所以:

re.findall(r"(.*?)(?:\[.*?\]|$)", example_str)

如果没有嵌套的括号:

([^[\]]+)(?:$|\[)

示例:

>>> import re
>>> s = 'Josie Smith [3996 COLLEGE AVENUE, SOMETOWN, MD 21003]Mugsy Dog Smith [2560 OAK ST, GLENMEADE, WI 14098]'
>>> re.findall(r'([^[\]]+)(?:$|\[)', s)
['Josie Smith ', 'Mugsy Dog Smith ']

说明:

([^[\]]+)   # match one or more characters that are not '[' or ']' and place in group 1
(?:$|\[)    # match either a '[' or at the end of the string, do not capture

相关问题 更多 >