1

我正在尝试使用正则表达式(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)

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

4

2 回答 2

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 原始字符串用于正则表达式,并以r( r'pattern here') 为前缀。它允许您\在模式中使用,而无需 python 尝试将其解释为字符串转义。它直接传递给正则表达式引擎。(参考)
  2. 用于\s匹配空格(空格和换行符)。
  3. 由于您已经有几种替代模式,因此不要制作()可选。它可能导致灾难性的回溯,这会使匹配大字符串变得非常慢。
    \(?\(
    \)?\)
  4. {1}不做任何事情。它只是重复上一个子模式一次,这与不指定任何内容相同。
  5. \br是无效的。它被解释为\b(ASCII bell-character) + the letter r
  6. '您在文本字符串的开头有一个引号字符 ( )。您打算^匹配任何行的开头,或者'是复制/粘贴错误。
  7. 组合模式时的一些错误:

    pattern = [pattern1, pattern2, pattern3, pattern4]
    pattern = series2string(pattern)
    
    expression(re.compile(pattern), text)
    
于 2015-09-21T08:25:05.183 回答
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)
于 2015-09-22T20:54:18.687 回答