我必须在python中找到多行模式。所以我使用的是regex中的DOTALL,但它发现的比我需要的更多。
示例文件:
if(condition_1)
{
....
some text
some text
if ((condition_1== condition_2) ||
(condition_3== condition_4) ||
(condition_6== condition_5) ||
(condition_7== condition_8) ) // XYZ_variable
{
...
我的python正则表达式如下
re.compile(r'(if\s*?\()(.*?)(\/\/\s*?)(XYZ_variable)', re.DOTALL)
这是从第一个if条件到XYZ_变量的查找,但我只需要第二个if条件,其中XYZ_变量存在。
所以我改了我的正则表达式如下
re.compile(r'(if\s*?\()([^\{].*?)(\/\/\s*?)(XYZ_variable)', re.DOTALL)
我的最终输出应该是
if(condition_1)
{
....
some text
some text
if (((condition_1== condition_2) ||
(condition_3== condition_4) ||
(condition_6== condition_5) ||
(condition_7== condition_8) ) || XYZ_variable )
{
...
但是我的regex做了这样的事情
if ((condition_1)
{
....
some text
some text
if ((condition_1== condition_2) ||
(condition_3== condition_4) ||
(condition_6== condition_5) ||
(condition_7== condition_8) ) || XYZ_variable )
{
...
最佳答案
你可以用
re.sub(r'(?m)^(\s*if\s*)(\(.*(?:\n(?!\s*if\s*\().*)*)//\s*(\w+)\s*$', r'\1(\2 || \3)', s)
请参见regex demo。
细节
(?m)
-re.M
标志^
-行的开始(\s*if\s*)
-第一组:if
用0+空格括起来(\(.*(?:\n(?!\s*if\s*\().*)*)
-第2组:\(
-a(
.*
-线路的其余部分(?:\n(?!\s*if\s*\().*)*
-0次或多次重复\n(?!\s*if\s*\()
-换行符LF,后面不跟if
并用0+空格括起来,后面跟着(
.*
-线路的其余部分//\s*
-//
和0+空格(\w+)
-第3组:1个或多个字字符\s*$
-0+空格和行尾。Python demo:
import re
s = """if(condition_1)
{
....
some text
some text
if ((condition_1== condition_2) ||
(condition_3== condition_4) ||
(condition_6== condition_5) ||
(condition_7== condition_8) ) // XYZ_variable
{
..."""
print( re.sub(r'(?m)^(\s*if\s*)(\(.*(?:\n(?!\s*if\s*\().*)*)//\s*(\w+)\s*$', r'\1(\2 || \3)', s) )
输出:
if(condition_1)
{
....
some text
some text
if (((condition_1== condition_2) ||
(condition_3== condition_4) ||
(condition_6== condition_5) ||
(condition_7== condition_8) ) || XYZ_variable)
{
...
关于python - 如何在Python中使用具有字符异常的多行DOTALL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55277811/