[英]python regular expression grouping
我的正则表达式目标:
“如果句子中包含'#',则将所有内容分组到'#'的左侧,并将所有内容分组在'#'的右侧。如果字符没有'#',然后将整个句子归为一组”
两种情况的示例:
A) '120x4#Words' -> ('120x4', 'Words')
B) '120x4@9.5' -> ('120x4@9.5')
我做了一个可以正确解析情况A的正则表达式
(.*)(?:#(.*))
# List the groups found
>>> r.groups()
(u'120x4', u'words')
但是,这当然不适用于情况B-我需要将“#及其右边的所有内容”设置为可选
因此我尝试使用“?” 第二个分组上的“零或无”运算符表示它是可选的。
(.*)(?:#(.*))?
但这给我不好的结果。 第一组吃掉了整个串。
# List the groups found
>>> r.groups()
(u'120x4#words', None)
猜猜我是不是误解了一个或一个'?' 运算符及其在分组上的工作方式,或者我误解了第一组如何表现贪婪并抓取整个字符串。 我确实尝试过让第一组“不愿”,但这给了我一个完全不匹配的机会。
(.*?)(?:#(.*))?
# List the groups found
>>> r.groups()
(u'', None)
使用re.split
:
>>> import re
>>> a='120x4#Words'
>>> re.split('#',a)
['120x4', 'Words']
>>> b='120x4@9.5'
>>> re.split('#',b)
['120x4@9.5']
>>>
这里有一个详细的re
解。 但是,最好使用str.split
。
import re
REGEX = re.compile(r'''
\A
(?P<left>.*?)
(?:
[#]
(?P<right>.*)
)?
\Z
''', re.VERBOSE)
def parse(text):
match = REGEX.match(text)
if match:
return tuple(filter(None, match.groups()))
print(parse('120x4#Words'))
print(parse('120x4@9.5'))
更好的解决方案
def parse(text):
return text.split('#', maxsplit=1)
print(parse('120x4#Words'))
print(parse('120x4@9.5'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.