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

时间:2011-08-24 21:28:47

标签: 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 仅限姓名,而不是夫妻:

我想这样做:

print(match.group("beginningwithred") + " " + match.group("number")

并获得:

banana 36
apple 23
horse 56

然后做:

print(match.group("endingwithred") + " " + match.group("number")

并获得:

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之间没有帮助.. 我也尝试使用 {} ,包括整个两个表达式,但它也不起作用。 它一定不是很复杂,但我找不到什么是错的。

2 个答案:

答案 0 :(得分:3)

我没有完全遵循,但听起来你想要在你的替代品周围找到非捕获组:

(?: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')

<强> UPDATE2

如果您只想打印非None值,则可以执行以下操作:

  >>> for m in r.finditer(s):
  ...     print(','.join(g for g in m.groups() if g is not None))

答案 1 :(得分:1)

我确信找不到匹配所有出现的 extra_terrestial_regex 是不可能的,第一个位置为'red',第二个位置为'red',但是:

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