我的正则表达目标:
“如果句子中有'#',则将所有内容分组到'#'左侧,并将所有内容分组到'#'右侧。如果该字符没有'#' #',然后将整个句子作为一个组返回“
两种情况的例子:
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)
答案 0 :(得分:3)
答案 1 :(得分:1)
使用re.split
:
>>> import re
>>> a='120x4#Words'
>>> re.split('#',a)
['120x4', 'Words']
>>> b='120x4@9.5'
>>> re.split('#',b)
['120x4@9.5']
>>>
答案 2 :(得分:1)
答案 3 :(得分:1)
这是一个冗长的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'))