我试图用正则表达式获取括号外的任何文本。
示例字符串
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]
组合,但我假设一个字符串中可能有任意数量的组合。
如果要使用regex并仍然处理嵌套括号,可以使用:
这将产生
['myexpr', 'another']
。其思想是匹配字符串开头或
]
与字符串结尾或[
之间的任何内容。如果没有嵌套的括号,可以执行以下操作:
然而,你甚至不需要一个正则表达式在这里。只需在括号中分开:
你尝试失败的唯一原因是:
…是在括号内进行非贪婪匹配,这意味着它捕获了从第一个开放括号到最后一个闭括号的所有内容,而不是只捕获第一对括号。
而且,结尾的
+
似乎是错误的。如果你有'abc [def][ghi] jkl[mno]'
,你想回去['abc ', '', ' jkl']
,还是['abc ', ' jkl']
?如果是前者,则不要添加+
。如果是后者,那么您需要将整个括号模式放入一个非捕获组:r'(.*?)(?:\[.*?\])+
。如果最后一个括号后面可能还有其他文本,
split
方法将工作正常,或者您可以使用re.split
而不是re.findall
…但是如果您想调整原始regex以使用它,则可以。在英语中,你想要的是在字符串末尾的括号括起来的子字符串或之前的任何(非贪婪的)子字符串,对吧?
所以,您需要在
\[.*?\]
和$
之间进行交替。当然,你需要对它进行分组才能写出替换,而且你不想捕获这个组。所以:如果没有嵌套的括号:
示例:
说明:
相关问题 更多 >
编程相关推荐