使用OR运算符的Python正则表达式

时间:2015-09-21 08:21:18

标签: python regex or-operator

我正在尝试使用正则表达式(RE)解析大量文本文件。我试图从这些文件中提取包含' vu' 的文本部分,并以换行符结束' \ n'

模式因文件而异,所以我尝试使用 OR 运算符在我的文件中查找RE的组合。但是,我找不到自动化代码的方法,以便 re.findall()函数查找RE的组合。

以下是我尝试解决此问题的示例,但显然我仍无法在 re.findall()中评估我的正则表达式和OR运算符:

research_area

注意:我通过查找 for循环中的每个模式来规避这个问题,但如果我只能使用 re.findall,我的代码会运行得更快( )一次。

2 个答案:

答案 0 :(得分:5)

Python正则表达式使用|运算符进行交替。

def series2string(myserie) :
    myserie2 = '|'.join(serie for serie in myserie)
    myserie2 = '(' + myserie2 + ')'
    return myserie2

更多信息:https://docs.python.org/3/library/re.html

个别模式看起来非常混乱,所以我不知道什么是错误,什么是故意的。我猜你正在寻找" vu"在几个不同的背景下。

  1. 始终将Python原始字符串用于正则表达式,前缀为rr'pattern here')。它允许您在模式中使用\而不使用python尝试将其解释为字符串转义。它直接传递给正则表达式引擎。 (ref)
  2. 使用\s匹配空格(空格和换行符)。
  3. 由于您已经有多种替代模式,因此不要选择()。它可能导致灾难性的回溯,这会使匹配的大字符串变得非常慢 \(?\(
    \)?\)
  4. {1}没有做任何事情。它只重复一次前一个子模式,这与未指定任何内容相同。
  5. \br无效。它被解释为\b(ASCII钟形字符)+字母r
  6. 在文本字符串的开头有一个引号字符(')。要么^要匹配任何行的开头,要么'是复制/粘贴错误。
  7. 组合模式时出现一些错误:

    pattern = [pattern1, pattern2, pattern3, pattern4]
    pattern = series2string(pattern)
    
    expression(re.compile(pattern), text)
    

答案 1 :(得分:1)

感谢您的提示。我的正则表达式在我的第一篇文章中有点笨拙(我改变了它们,希望这个问题更容易理解)。感谢'|'设法捕获了 OR 运算符're.compile',代码运行正常!

import re

def series2string(myserie) :
    myserie2 = '|'.join(serie for serie in myserie)
    return myserie2

def expression(pattern, mystring) : 
    x = re.findall(pattern, mystring)
    if len(x)>0:
        return 1
    else:
        return 0

#text example
text = "\n\n    (troisième chambre)\n    i - vu la requête, enregistrée le 28 février 1997 sous le n° 97nc00465, présentée pour m. z... farinez, demeurant ... à dommartin-aux-bois (vosges), par me y..., avocat ;\n"

#expressions to look out
pattern1 = r'^\s*vu.*\n'
pattern2 = r'^\s*\(\w*\s*\w*\)\s*.*?vu.*\n'

pattern = [pattern1, pattern2]
pattern = series2string(pattern)

expression(re.compile(pattern), text)