【问题标题】:Python regular expression split with optional word in patternPython 正则表达式拆分与模式中的可选单词
【发布时间】:2018-03-22 03:57:09
【问题描述】:

我正在尝试围绕可能包含或不包含特定单词的特定短语拆分字符串。我正在努力为此找到正确的语法。

这是当前版本的代码:

import re
from pprint import pprint

text = """Here is a list: Bob talked to Caleb, and Caleb talked to Derek, and Derek talked to Eric, and Eric talked to Fred, and Fred talked to Greg, and Greg talked to Henry, and Henry talked to Isaac, and Isaac talked to Jesse, and Jesse talked to Ken."""

pprint(re.split(r"(a?n?d? ?\w+ talked to)",text))

在此示例中,我想拆分“Bob 交谈过”或“and Caleb 交谈过”,因此 and 应该包含在是否存在或不存在的情况下。

这段代码产生(几乎正确):

['Here is a list:',
 ' Bob talked to',
 ' Caleb, ',
 'and Caleb talked to',
 ' Derek, ',
 'and Derek talked to',
 ' Eric, ',
 'and Eric talked to',
 ' Fred, ',
 'and Fred talked to',
 ' Greg, ',
 'and Greg talked to',
 ' Henry, ',
 'and Henry talked to',
 ' Isaac, ',
 'and Isaac talked to',
 ' Jesse, ',
 'and Jesse talked to',
 ' Ken.']

唯一的小错误是“​​Bob”前面有一个空格,因为有一个“?”而被捕获。在正则表达式中。所以我不想要每个字母“a?n?d??”。我宁愿有“(和)?”

不幸的是,结果如下:

print(re.split(r"((and )?\w+ talked to)",text))

给我:

['Here is a list: ',
 'Bob talked to',
 None,
 ' Caleb, ',
 'and Caleb talked to',
 'and ',
 ' Derek, ',
 'and Derek talked to',
 'and ',
 ' Eric, ',
 'and Eric talked to',
 'and ',
 ' Fred, ',
 'and Fred talked to',
 'and ',
 ' Greg, ',
 'and Greg talked to',
 'and ',
 ' Henry, ',
 'and Henry talked to',
 'and ',
 ' Isaac, ',
 'and Isaac talked to',
 'and ',
 ' Jesse, ',
 'and Jesse talked to',
 'and ',
 ' Ken.']

在这里,它分别寻找两个单元。我也许可以使用它,但如果它是一个单元会更好。

另一个选项可能是:

pprint(re.split(r"([and ]?\w+ talked to)",text))

给予:

['Here is a list:',
 ' Bob talked to',
 ' Caleb, and',
 ' Caleb talked to',
 ' Derek, and',
 ' Derek talked to',
 ' Eric, and',
 ' Eric talked to',
 ' Fred, and',
 ' Fred talked to',
 ' Greg, and',
 ' Greg talked to',
 ' Henry, and',
 ' Henry talked to',
 ' Isaac, and',
 ' Isaac talked to',
 ' Jesse, and',
 ' Jesse talked to',
 ' Ken.']

在这种情况下,“和”不包括在内,即使它可用。那么我怎样才能使“和”作为一个单元是可选的呢?换句话说,“and”要么是in,要么是out,但不是in或out。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    我想这就是你想要的:

    ((?:and )?\w+ talked to)
    

    (?:and ) 是一个非捕获组,因此它匹配但未被捕获。

    【讨论】:

    • 太完美了!谢谢你。非捕获组现在敲响了警钟,并且以一种我第一次读到它时没有的方式变得有意义!
    猜你喜欢
    • 2012-09-24
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多