我在变量a
中有一个字符串,如下所示:
a = 'foo(123456) together with foo(2468)'
我想使用" re"从字符串中提取foo(123456)
和foo(2468)
。
我有两个问题:
foo(.\*)
似乎不起作用,因为它将123456)
与foo(2468
一起视为.*
答案 0 :(得分:6)
import re
pattern = re.compile(r'foo\(.*?\)')
test_str = 'foo(123456) together with foo(2468)'
for match in re.findall(pattern, test_str):
print(match)
两件事:
.*?
是懒惰量词。它的行为与贪心量词(.*
)的行为相同,只是它尝试匹配字符串中从左到右可能的最少字符数量。请注意,如果您想要在括号中匹配至少一个字符,则需要使用.+?
。
使用\(
和\)
代替(
和)
,因为括号通常在正则表达式中用于指示捕获组,因此如果您要匹配从字面上看,你必须在它们之前使用转义字符,这是反斜杠。
答案 1 :(得分:5)
您可以将findall与以下表达式一起使用:r'(foo\(\d+\))'
:
import re
a = 'foo(123456) together with foo(2468)'
for v in re.findall(r'(foo\(\d+\))', a):
print(v)
结果是:
foo(123456)
foo(2468)
由于foo(.*)
,您的expressoin ()
无效。你需要像我上面那样逃避它们。
答案 2 :(得分:4)
你可以使用否定的字符类。
>>> a = 'foo(123456) together with foo(2468) foo(abcdef) together with foo(jqk)'
>>> re.findall(r'\bfoo\([^()]*\)', a)
['foo(123456)', 'foo(2468)', 'foo(abcdef)', 'foo(jqk)']
[^()]*
否定了符合任何字符但不符合(
或)
的字符类,零次或多次。
答案 3 :(得分:2)
只需使用非贪婪的通配符表达式.*?
import re
a = 'foo(123456) together with foo(2468)'
for v in re.findall(r'foo\(.*?\)', a):
print(v)
答案 4 :(得分:1)
使用re.findall(r'foo\(.*?\)')
。反斜杠转义括号(它具有在正则表达式中表示组的特殊含义),并且问号使得匹配以非贪婪的方式执行。