Python 正则表达式:使用 re.split() 查找模式,即使重复也是如此

Python Regex: Find pattern, even if repeated, with re.split()

我正在尝试找到一种方法来检测字符串中的 ,or,即使它们是重复的。所以即使是 one , , or or, two 和 re.split() 这样的字符串也应该 return “一个”和“两个”。

到目前为止,这就是我所拥有的(使用 Python 3.10):

import re

pattern = re.compile(r"(?:\s*,\s*or\s*|\s*,\s*|\s+or\s+)+", flags=re.I)
string = "one,two or three   ,   four   or   five  or , or six , oR   ,  seven, ,,or,   ,, eight or qwertyor orqwerty,"
result = re.split(pattern, string)
print(result)

哪个returns:

['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'qwertyor orqwerty', '']

到目前为止,我的问题是如果我有连续的 or,我的模式将只能识别每个其他 or。例如:

string = "one or or two"
>>> ['one', 'or two']

string = "one or or or two"
>>> ['one', 'or', 'two']

请注意,在第一个示例中,第二个元素包含 or,而在第二个示例中,or 本身就是一个元素。

有办法解决这个问题吗?此外,如果有更好的方法来分离这些字符串,我们也将不胜感激。

Python是否支持单词边界标记\b?如果是这样,您可以将正则表达式简化为以下几行:

\s*((,|\bor\b)\s*)+

您可以使用

import re
text = "one,two or three   ,   four   or   five  or , or six , oR   ,  seven, ,,or,   ,, eight or qwertyor orqwerty,"
print( re.split(r'(?:\s*(?:,|\bor\b))+\s*', text.rstrip().rstrip(',')) )
# => ['one', 'two', 'three', 'four', 'five', 'six', 'oR', 'seven', 'eight', 'qwertyor orqwerty']

参见Python demo and the regex demo

详情:

  • (?:\s*(?:,|\bor\b))+ - 重复一次或多次
    • \s* - 零个或多个空格
    • (?:,|\bor\b) - 逗号或整个单词 or
  • \s* - 零个或多个空格。

注意 non-capturing groups 的使用,这很重要,因为您正在使用 re.split.

中的模式

另外,请注意 text.rstrip().rstrip(',') 以便结果中没有尾随的空项。