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

Tan*_*guy 1 python regex or-operator

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

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

这是我试图解决这个问题的一个例子,但显然我仍然无法在re.findall()中评估我的正则表达式和OR运算符:

import re

def series2string(myserie) :
    myserie2 = ' or '.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 = '^\s*vu.*\n'
pattern2 = '^\s*\(\w*\s*\w*\)\s*.*?vu.*\n'

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

expression(pattern, text)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*rot 5

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

def series2string(myserie) :
    myserie2 = '|'.join(serie for serie in myserie)
    myserie2 = '(' + myserie2 + ')'
    return myserie2
Run Code Online (Sandbox Code Playgroud)

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


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

  1. 始终将Python原始字符串用于正则表达式,前缀为r(r'pattern here').它允许您\在没有python的模式中使用,试图将其解释为字符串转义.它直接传递给正则表达式引擎.(参考文献)
  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)
    
    Run Code Online (Sandbox Code Playgroud)