在Python中使用正则表达式提取子字符串

时间:2019-06-11 12:13:51

标签: python regex

如何从字符串中提取关键字amisare之后的子字符串,但不包括amisare

string = 'I am John'

我用过:

re.findall('(?<=(am|is|are)).*', string)

发生错误

re.error: look-behind requires fixed-width pattern

正确的方法是什么?

3 个答案:

答案 0 :(得分:1)

import re

s = 'I am John'

g = re.findall(r'(?:am|is|are)\s+(.*)', s)
print(g)

打印:

['John']

答案 1 :(得分:0)

在这种情况下,我喜欢使用finditer,因为它返回的匹配对象比findall返回的字符串更易于操作。您可以继续匹配am / is / are,也可以将字符串的其余部分与第二个子组匹配,然后从结果中仅提取该组。

>>> import re
>>> string = 'I am John'
>>> [m.group(2) for m in re.finditer("(am|is|are)(.*)", string)]
[' John']

根据模式的结构,我猜想您最多只希望字符串中有一个匹配项。考虑使用re.search而不是findall或finditer。

>>> re.search("(am|is|are)(.*)", string).group(2)
' John'

如果您想“实际上我想匹配单词am / is / are之后的每个单词实例,而不仅仅是第一个实例”,那是一个问题,因为您的.*组件将匹配其余所有单词第一个am / is / are之后的字符串。例如。对于字符串"I am John and he is Steve",它将匹配' John and he is Steve'。如果您想分别使用John和Steve,则可以限制要匹配的字符类。 \w似乎很明智:

>>> string = "I am John and he is Steve"
>>> [m.group(2) for m in re.finditer(r"(am|is|are) (\w*)", string)]
['John', 'Steve']

答案 2 :(得分:0)

解决方案之一是使用分区功能。有一个例子

string = 'I am John'
words = ['am','is','are']

for word in words :
    before,word,after = string.partition(word)
    print (after)

输出:

 John