1

我找不到如何处理正则表达式,这里有一个例子:

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 之间没有帮助。我尝试使用{ }也包括整个两个表达式,但它也不起作用。它一定不是很复杂,但我无法找出问题所在。

4

2 回答 2

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

更新2

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

  >>> for m in r.finditer(s):
  ...     print(','.join(g for g in m.groups() if g is not None))
于 2011-08-24T21:36:32.157 回答
1

我敢肯定,不可能找到一个与所有出现匹配的extra_terrestial_regex,即第一个位置为“红色”的事件和第二个位置为“红色”的事件,但是这样:

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
于 2011-08-25T00:49:17.803 回答