Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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_Regex Group - Fatal编程技术网

python中的正则表达式:组和|

python中的正则表达式:组和|,python,regex,regex-group,Python,Regex,Regex Group,我找不到如何处理正则表达式,下面是一个示例: string = "red\\/banana 36 monkey\\/apple 14 red\\/apple 23 red\\/horse 56 bull\\/red 67 monkey\\/red 45 bull\\/shark 89" 我想用re.match.group做一个正则表达式,它将只考虑像red/xxxx这样的正则表达式和像xxxx/red这样的正则表达式,并且只对xxxx的名称进行分组,而不是成对的: 我想做

我找不到如何处理正则表达式,下面是一个示例:

string = "red\\/banana 36    monkey\\/apple 14   red\\/apple 23  red\\/horse 56  bull\\/red 67  monkey\\/red 45    bull\\/shark 89"
我想用re.match.group做一个正则表达式,它将只考虑像red/xxxx这样的正则表达式和像xxxx/red这样的正则表达式,并且只对xxxx的名称进行分组,而不是成对的:

我想做:

print(match.group("beginningwithred") + " " + match.group("number")
并获得:

banana 36
apple 23
horse 56
bull 67
monkey 45
然后做:

print(match.group("endingwithred") + " " + match.group("number")
并获得:

banana 36
apple 23
horse 56
bull 67
monkey 45
我目前的代码如下:

iterator = regex.finditer(string)
for match in iterator:
    regex = re.compile('red\\\\\\\\/(?P<beginningwithred>banana|apple|horse)|(?P<endingwithred>bull|monkey)\\\\\\\\/red (?P<number>\d\d)')
但它不起作用,我不能在组之间使用|,python HOWTO也帮不上忙。。 我也试过用{}来包含这两个表达式,但都不起作用。
这一定不是很复杂,但我无法找出问题所在。

我不完全明白,但听起来您希望在备选方案周围有非捕获组:

(?:foo|bar|baz)
这样,您就可以使用|,而无需创建真正的组

更新为什么没有帮助?这不对吗

>>> s="red\\/banana 36    monkey\\/apple 14   red\\/apple 23  red\\/horse 56  bull\\/red 67  monkey\\/red 45    bull\\/shark 89"
>>> r = re.compile(r'(?:red\\/(?P<begin>\w+)|(?P<end>\w+)\\/red)\s+(?P<number>\d+)')
>>> for m in r.finditer(s):
...     print(m.groups())

('banana', None, '36')
('apple', None, '23')
('horse', None, '56')
(None, 'bull', '67')
(None, 'monkey', '45')

我不完全同意,但听起来你希望在你的备选方案周围有非捕获组:

(?:foo|bar|baz)
这样,您就可以使用|,而无需创建真正的组

更新为什么没有帮助?这不对吗

>>> s="red\\/banana 36    monkey\\/apple 14   red\\/apple 23  red\\/horse 56  bull\\/red 67  monkey\\/red 45    bull\\/shark 89"
>>> r = re.compile(r'(?:red\\/(?P<begin>\w+)|(?P<end>\w+)\\/red)\s+(?P<number>\d+)')
>>> for m in r.finditer(s):
...     print(m.groups())

('banana', None, '36')
('apple', None, '23')
('horse', None, '56')
(None, 'bull', '67')
(None, 'monkey', '45')

我确信不可能找到一个与所有事件相匹配的额外规则,第一位是“红色”,第二位是“红色”,但是:

for mat in extra_terrestial_regex.finditer(s):
    print mat.group("beginningwithred") + " " + match.group("number")
将仅选择第一个位置为“红色”的匹配项,并跳过其他匹配项

它不是一个可以得到这样一个结果的正则表达式,它只是一个函数;下面的一个是否执行您想要的操作

import re

s = ('red\\/banana 36    monkey\\/apple 14  '
     'red\\/apple 23  red\\/horse 56  bull\\/red 67 '
     'monkey\\/red 45    bull\\/shark 89')


def gen(s,what,word):
    if what=='beginning':
        regx = re.compile(r'%s\\/([^ ]+) (\d+)' % word)
    elif what=='ending':
        regx = re.compile(r'([^ ]+)\\/%s (\d+)' % word)
    else:
        regx = re.compile('(\A).*(\Z)')
    for mat in regx.finditer(s):
        yield mat.groups()


print '\n'.join('%s %s' % x for x in gen(s,'beginning','red'))
print '----------------'
print '\n'.join('%s %s' % x for x in gen(s,'ending','red'))
print '----------------'
print '\n'.join('%s %s' % x for x in gen(s,'ZOU','red'))
print '----------------'
print '\n'.join('%s %s' % x for x in gen(s,'ending','apple'))
结果

banana 36
apple 23
horse 56
----------------
bull 67
monkey 45
----------------

----------------
monkey 14
red 23

我确信不可能找到一个与所有事件相匹配的额外规则,第一位是“红色”,第二位是“红色”,但是:

for mat in extra_terrestial_regex.finditer(s):
    print mat.group("beginningwithred") + " " + match.group("number")
将仅选择第一个位置为“红色”的匹配项,并跳过其他匹配项

它不是一个可以得到这样一个结果的正则表达式,它只是一个函数;下面的一个是否执行您想要的操作

import re

s = ('red\\/banana 36    monkey\\/apple 14  '
     'red\\/apple 23  red\\/horse 56  bull\\/red 67 '
     'monkey\\/red 45    bull\\/shark 89')


def gen(s,what,word):
    if what=='beginning':
        regx = re.compile(r'%s\\/([^ ]+) (\d+)' % word)
    elif what=='ending':
        regx = re.compile(r'([^ ]+)\\/%s (\d+)' % word)
    else:
        regx = re.compile('(\A).*(\Z)')
    for mat in regx.finditer(s):
        yield mat.groups()


print '\n'.join('%s %s' % x for x in gen(s,'beginning','red'))
print '----------------'
print '\n'.join('%s %s' % x for x in gen(s,'ending','red'))
print '----------------'
print '\n'.join('%s %s' % x for x in gen(s,'ZOU','red'))
print '----------------'
print '\n'.join('%s %s' % x for x in gen(s,'ending','apple'))
结果

banana 36
apple 23
horse 56
----------------
bull 67
monkey 45
----------------

----------------
monkey 14
red 23

有了thoses,我会混合一些东西,比如红色/红色或猴子/猴子。。。如果我使用它们,我会得到名字之间带有\\/的夫妇,我不想扩展我的答案。我想这就是你要找的东西。如果没有,请更清楚地解释原因。这很有帮助,谢谢你们两位,顺便说一句,安德鲁,一定还有2\\n更多的东西可以让它工作。比如:r=re.compiler'?:red\\\\\/?P……有了这些,我将混合使用诸如red/red或monkey/monkey之类的东西。。。如果我使用它们,我会得到名字之间带有\\/的夫妇,我不想扩展我的答案。我想这就是你要找的东西。如果没有,请更清楚地解释原因。这很有帮助,谢谢你们两位,顺便说一句,安德鲁,一定还有2\\n更多的东西可以让它工作。比如:r=re.compiler'?:red\\\\\/?P……你必须使用regex吗,或者更简单的东西可以接受吗?实际上它的html代码,我可以解析它,但我需要非常快的速度,因此我更喜欢使用与问题相关的regex,但是考虑使用原始字符串R'Stand来限制你必须使用ReGEX的逃逸次数,或者更简单的方法是可接受的吗?实际上它的HTML代码和我可以解析它,但是我需要这个非常快,因此我更喜欢使用与此问题相关的RexExSee。但是考虑使用原始字符串r'字符串来限制你必须做的逃逸次数。