regex 如何在python中将多个正则表达式组合成一个正则表达式?

lnvxswe2  于 2022-12-01  发布在  Python
关注(0)|答案(4)|浏览(98)

我正在学习正则表达式。我不知道如何将不同的正则表达式组合成一个通用的正则表达式。
我想写一个单一的正则表达式,它适用于多种情况。我知道这是可以用简单的方法,通过使用 * 或**”|“* 符。
我不喜欢这种方法。谁能告诉我更好的方法?

1aaf6o9v

1aaf6o9v1#

你需要编译所有的正则表达式函数。

import re
re1 = r'\d+\.\d*[L][-]\d*\s[A-Z]*[/]\d*'
re2 = '\d*[/]\d*[A-Z]*\d*\s[A-Z]*\d*[A-Z]*'
re3 = '[A-Z]*\d+[/]\d+[A-Z]\d+'
re4 = '\d+[/]\d+[A-Z]*\d+\s\d+[A-Z]\s[A-Z]*'

sentences = [string1, string2, string3, string4]
for sentence in sentences:
    generic_re = re.compile("(%s|%s|%s|%s)" % (re1, re2, re3, re4)).findall(sentence)
pinkon5k

pinkon5k2#

对于findall和任意系列的RE,您所要做的就是连接每个RE返回的匹配列表:

re_list = [
    '\d+\.\d*[L][-]\d*\s[A-Z]*[/]\d*', # re1 in question,
    ...
    '\d+[/]\d+[A-Z]*\d+\s\d+[A-z]\s[A-Z]*', # re4 in question
]

matches = []
for r in re_list:
   matches += re.findall( r, string)

为了提高效率,最好使用已编译RE的列表。
或者,您可以使用以下命令连接元素RE字符串

generic_re = re.compile( '|'.join( re_list) )
nx7onnlm

nx7onnlm3#

我看到很多人都在使用管道,但这似乎只匹配第一个示例。如果你想匹配所有,那么尝试使用lookaheads。
示例:

>>> fruit_string = "10a11p" 
>>> fruit_regex = r'(?=.*?(?P<pears>\d+)p)(?=.*?(?P<apples>\d+)a)'
>>> re.match(fruit_regex, fruit_string).groupdict()
{'apples': '10', 'pears': '11'}
>>> re.match(fruit_regex, fruit_string).group(0)
'10a,11p'
>>> re.match(fruit_regex, fruit_string).group(1)
'11'

(?= ...)是一个前瞻性的问题:
如果...匹配下一个字符串,则匹配,但不使用任何字符串。这称为lookaheadAssert。例如,Isaac(?=Asimov)只有在“Isaac”后面跟“Asimov”时才匹配“Isaac”。
.*?(?P<pears>\d+)p在字符串中的任意位置找到一个后跟p的数字,并将该数字命名为“pears”

yfwxisqw

yfwxisqw4#

你可能不需要编译两个正则表达式模式。这里有一个方法,让我们看看它是否适合你。

>>> import re
>>> text = 'aaabaaaabbb'
>>> A = 'aaa'
>>> B = 'bbb'
>>> re.findall(A+B, text)
['aaabbb']
>>>

进一步阅读read_doc

相关问题