[英]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.