我正在学习正则表达式。我不知道如何将不同的正则表达式组合成一个通用的正则表达式。我想写一个单一的正则表达式,它适用于多种情况。我知道这是可以用简单的方法,通过使用 * 或**”|“* 符。我不喜欢这种方法。谁能告诉我更好的方法?
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)
pinkon5k2#
对于findall和任意系列的RE,您所要做的就是连接每个RE返回的匹配列表:
findall
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) )
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”
(?= ...)
.*?(?P<pears>\d+)p
yfwxisqw4#
你可能不需要编译两个正则表达式模式。这里有一个方法,让我们看看它是否适合你。
>>> import re >>> text = 'aaabaaaabbb' >>> A = 'aaa' >>> B = 'bbb' >>> re.findall(A+B, text) ['aaabbb'] >>>
进一步阅读read_doc
4条答案
按热度按时间1aaf6o9v1#
你需要编译所有的正则表达式函数。
pinkon5k2#
对于
findall
和任意系列的RE,您所要做的就是连接每个RE返回的匹配列表:为了提高效率,最好使用已编译RE的列表。
或者,您可以使用以下命令连接元素RE字符串
nx7onnlm3#
我看到很多人都在使用管道,但这似乎只匹配第一个示例。如果你想匹配所有,那么尝试使用lookaheads。
示例:
(?= ...)
是一个前瞻性的问题:如果...匹配下一个字符串,则匹配,但不使用任何字符串。这称为lookaheadAssert。例如,Isaac(?=Asimov)只有在“Isaac”后面跟“Asimov”时才匹配“Isaac”。
.*?(?P<pears>\d+)p
在字符串中的任意位置找到一个后跟p的数字,并将该数字命名为“pears”yfwxisqw4#
你可能不需要编译两个正则表达式模式。这里有一个方法,让我们看看它是否适合你。
进一步阅读read_doc