Python 使用 OR 运算符的正则表达式
Python regular expression using the OR operator
我正在尝试使用正则表达式 (RE) 解析大量文本文件样本。我试图从这些文件中提取包含 'vu' 并以换行符 '\n' 结尾的文本部分。
每个文件的模式不同,所以我尝试使用 OR 运算符在我的文件中查找 RE 的组合。但是,我没有找到一种方法来自动化我的代码,以便 re.findall() 函数查找 RE.
的组合
这是我如何尝试解决此问题的示例,但显然我仍然无法评估 re.findall()[=28= 中的正则表达式和 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() 一次。
Python 正则表达式使用 |
运算符进行交替。
def series2string(myserie) :
myserie2 = '|'.join(serie for serie in myserie)
myserie2 = '(' + myserie2 + ')'
return myserie2
更多信息:https://docs.python.org/3/library/re.html
个别图案看起来很乱,不知道什么是错误,什么是故意的。我猜您是在几个不同的上下文中查找 "vu" 这个词。
- 始终使用 Python 原始字符串作为正则表达式,前缀为
r
(r'pattern here'
)。它允许您在模式中使用 \
而不会 python 试图将其解释为字符串转义。它直接传递给正则表达式引擎。 (ref)
- 使用
\s
匹配white-space(spaces和换行符)。
- 由于您已经有多个替代模式,所以不要将
(
和 )
设为可选。它会导致灾难性的回溯,这会使匹配大字符串变得非常慢。
\(?
→ \(
\)?
→ \)
{1}
什么都不做。它只是重复之前的子模式一次,这与不指定任何内容相同。
\br
无效。它被解释为 \b
(ASCII 响铃字符)+ 字母 r
.
- 您的文本字符串开头有一个引号字符 (
'
)。您打算 ^
匹配任何行的开头,或者 '
是 copy/paste 错误。
组合模式时出现一些错误:
pattern = [pattern1, pattern2, pattern3, pattern4]
pattern = series2string(pattern)
expression(re.compile(pattern), text)
感谢您的提示。我的正则表达式在我的第一个 post 中有点笨拙(我改变了它们希望这个问题更容易理解)。由于“re.compile
”,我设法捕获了 OR 运算符“|
”,代码工作正常!
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)
我正在尝试使用正则表达式 (RE) 解析大量文本文件样本。我试图从这些文件中提取包含 'vu' 并以换行符 '\n' 结尾的文本部分。
每个文件的模式不同,所以我尝试使用 OR 运算符在我的文件中查找 RE 的组合。但是,我没有找到一种方法来自动化我的代码,以便 re.findall() 函数查找 RE.
的组合这是我如何尝试解决此问题的示例,但显然我仍然无法评估 re.findall()[=28= 中的正则表达式和 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() 一次。
Python 正则表达式使用 |
运算符进行交替。
def series2string(myserie) :
myserie2 = '|'.join(serie for serie in myserie)
myserie2 = '(' + myserie2 + ')'
return myserie2
更多信息:https://docs.python.org/3/library/re.html
个别图案看起来很乱,不知道什么是错误,什么是故意的。我猜您是在几个不同的上下文中查找 "vu" 这个词。
- 始终使用 Python 原始字符串作为正则表达式,前缀为
r
(r'pattern here'
)。它允许您在模式中使用\
而不会 python 试图将其解释为字符串转义。它直接传递给正则表达式引擎。 (ref) - 使用
\s
匹配white-space(spaces和换行符)。 - 由于您已经有多个替代模式,所以不要将
(
和)
设为可选。它会导致灾难性的回溯,这会使匹配大字符串变得非常慢。
\(?
→\(
\)?
→\)
{1}
什么都不做。它只是重复之前的子模式一次,这与不指定任何内容相同。\br
无效。它被解释为\b
(ASCII 响铃字符)+ 字母r
.- 您的文本字符串开头有一个引号字符 (
'
)。您打算^
匹配任何行的开头,或者'
是 copy/paste 错误。 组合模式时出现一些错误:
pattern = [pattern1, pattern2, pattern3, pattern4] pattern = series2string(pattern) expression(re.compile(pattern), text)
感谢您的提示。我的正则表达式在我的第一个 post 中有点笨拙(我改变了它们希望这个问题更容易理解)。由于“re.compile
”,我设法捕获了 OR 运算符“|
”,代码工作正常!
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)