簡體   English   中英

python正則表達式分組

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

只需使用標准的str.split函數:

s = '120x4#Words'
x = s.split( '#' )

如果仍然需要正則表達式解決方案,請使用以下模式:

([^#]+)(?:#(.*))?

使用re.split

>>> import re
>>> a='120x4#Words'
>>> re.split('#',a)
['120x4', 'Words']
>>> b='120x4@9.5'
>>> re.split('#',b)
['120x4@9.5']
>>> 
(.*?)#(.*)|(.+)

這應該工作。請參閱演示。

http://regex101.com/r/oC3nN4/14

這里有一個詳細的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM