使用Python3正则表达式返回匹配之间的重叠字符串

时间:2019-02-08 22:38:16

标签: regex python-3.x

理想结果:

我想输出

[2+ years in buy side research, 2+ years in accounting]

在下面的字符串中,该字符串是职位描述中的句子,

'2+ years in buy side research or accounting'

因此,两次比赛都重复使用2+ years in,并在or上进行拆分。

但是我正在写复杂的正则表达式。

当前结果:

str1 = '2+ years in buy side research or accounting'

pattern = re.compile(r'([0-9+]+ years|year)')

match_object = re.findall(pattern, str1)

=> ['2+ years']

注意:我试图以最清晰的方式写这个问题的标题,但是如果有更清晰的书写方式,我很乐意接受编辑。

1 个答案:

答案 0 :(得分:1)

这里一种可能的方法是匹配x years in之后所有用空格分隔的单词,然后匹配or连词之后的任意数量的单词,一旦获得匹配,则通过附加这些单词来构建结果列表x years in部分的单词。

注意,如果字符串在空格后的匹配模式之后包含更多单词,则可能会产生意外结果。

import re

str1 = '2+ years in buy side research or accounting'
pattern = re.compile(r'([0-9]+\+?\s*years?\s+in\s+)(\w+(?:\s+\w+)*(?:\s+or\s+\w+(?:\s+\w+)*)*)')
res = []
for m, n in re.findall(pattern, str1):
    for x in re.split(r'\s+or\s+', n):
        res.append("{}{}".format(m, x))

print(res) # => ['2+ years in buy side research', '2+ years in accounting']

请参见Python demo

正则表达式为

([0-9]+\+?\s*years?\s+in\s+)(\w+(?:\s+\w+)*(?:\s+or\s+\w+(?:\s+\w+)*)*)

请参见pattern demo。详细信息:

  • ([0-9]+\+?\s*years?\s+in\s+)-第1组:
    • [0-9]+-1个以上数字
    • \+?-可选的+
    • \s*-超过0个空格
    • years?-year和可选的s
    • \s+-超过1个空格
    • in-一个in
    • \s+-超过1个空格
  • (\w+(?:\s+\w+)*(?:\s+or\s+\w+(?:\s+\w+)*)*)-第2组:
    • \w+(?:\s+\w+)*-1个以上的字符字符,然后0个或多个重复的1+个空格和1+个字符字符
    • (?:\s+or\s+\w+(?:\s+\w+)*)*-重复or的0或多个重复,并用1+空格括起来,然后跟随上面的模式