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(',')
以便结果中没有尾随的空项。
我正在尝试找到一种方法来检测字符串中的 ,
和 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(',')
以便结果中没有尾随的空项。