Python - 使用RegEx从字符串中提取模式

时间:2015-04-02 01:56:40

标签: python regex

我在变量a中有一个字符串,如下所示:

a = 'foo(123456) together with foo(2468)'

我想使用" re"从字符串中提取foo(123456)foo(2468)

我有两个问题:

  1. 使用的正确正则表达式是什么? foo(.\*)似乎不起作用,因为它将123456)foo(2468一起视为.*
  2. 如何提取两个foo?

5 个答案:

答案 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. .*?是懒惰量词。它的行为与贪心量词(.*)的行为相同,只是它尝试匹配字符串中从左到右可能的最少字符数量。请注意,如果您想要在括号中匹配至少一个字符,则需要使用.+?

  2. 使用\(\)代替(),因为括号通常在正则表达式中用于指示捕获组,因此如果您要匹配从字面上看,你必须在它们之前使用转义字符,这是反斜杠。

答案 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\(.*?\)')。反斜杠转义括号(它具有在正则表达式中表示组的特殊含义),并且问号使得匹配以非贪婪的方式执行。