python正则表达式分组

时间:2014-09-07 14:25:07

标签: python regex

我的正则表达目标:

“如果句子中有'#',则将所有内容分组到'#'左侧,并将所有内容分组到'#'右侧。如果该字符没有'#' #',然后将整个句子作为一个组返回“

两种情况的例子:

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)

4 个答案:

答案 0 :(得分:3)

只需使用标准str.split功能:

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

如果您仍需要正则表达式解决方案,请使用以下模式:

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

答案 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)

(.*?)#(.*)|(.+)

这个可以工作。参见演示。

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

答案 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'))