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'字符串来限制你必须做的逃逸次数。