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