Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式分组_Python_Regex - Fatal编程技术网

python正则表达式分组

python正则表达式分组,python,regex,Python,Regex,我的正则表达式目标: 如果句子中有一个“#”,则将所有内容分组到“#”的左侧,并将所有内容分组到“#”的右侧。如果角色没有“#”,则只需将整个句子作为一个组返回即可 这两种情况的例子: A) '120x4#Words' -> ('120x4', 'Words') B) '120x4@9.5' -> ('120x4@9.5') 我制作了一个正则表达式,可以正确解析案例a (.*)(?:#(.*)) # List the groups found >>> r.gro

我的正则表达式目标:

如果句子中有一个“#”,则将所有内容分组到“#”的左侧,并将所有内容分组到“#”的右侧。如果角色没有“#”,则只需将整个句子作为一个组返回即可

这两种情况的例子:

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)
我可能误解了none或one“?”操作符及其在分组中的工作方式,或者我误解了第一个组是如何贪婪地抓住整个字符串的。我确实试着让第一组“不情愿”,但这让我完全没有对手

(.*?)(?:#(.*))?


# 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.split

>>> import re
>>> a='120x4#Words'
>>> re.split('#',a)
['120x4', 'Words']
>>> b='120x4@9.5'
>>> re.split('#',b)
['120x4@9.5']
>>> 
这将起作用。请参阅演示

这将起作用。请参阅演示

只需使用标准功能:

s = '120x4#Words'
x = s.split( '#' )
如果仍然需要正则表达式解决方案,请使用以下模式:

([^#]+)(?:#(.*))?
只需使用标准功能:

s = '120x4#Words'
x = s.split( '#' )
如果仍然需要正则表达式解决方案,请使用以下模式:

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

这里有一个详细的
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'))

这里有一个详细的
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'))

哇,这也是一个测试正则表达式的好网站——感谢lotWow,这也是一个测试正则表达式的好网站——非常感谢
str.split
的+1,尽管正则表达式只相当于字符串中最多出现一次
。+1表示
str.split
,虽然正则表达式仅在字符串中最多出现1次
#
时等效…是的,我同意拆分更整洁。就在今晚,我正在试验正则表达式。。。详细的修饰符看起来可以在将来帮我省去一些调试的麻烦…是的,我同意拆分更整洁。就在今晚,我正在试验正则表达式。。。详细修饰符看起来可以在将来帮我省去一些调试的麻烦。。。。