如何在python中使用带字符异常的多行DOTALL
我必须在python中找到多行模式。所以我使用的是来自regex的DOTALL,但它发现了比我需要的更多的东西 示例文件:如何在python中使用带字符异常的多行DOTALL,python,regex,python-3.x,Python,Regex,Python 3.x,我必须在python中找到多行模式。所以我使用的是来自regex的DOTALL,但它发现了比我需要的更多的东西 示例文件: if(condition_1) { .... some text some text if ((condition_1== condition_2) || (condition_3== condition_4) || (condition_6== condition_5) || (condition_
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 )
{
...
但是我的正则表达式是这样的
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 )
{
...
正则表达式捕获匹配的第一个模式。这就是为什么它总是从第一个
if
开始
考虑以下最小示例,其中非贪婪的?
不会修改输出:
>>> re.compile(r"if(.*?)XYZ").search("if a if b if c XYZ").group(1)
' a if b if c '
>>> re.compile(r"if(.*?)XYZ").search("if a XYZ if b if c XYZ").group(1)
' a '
但是,非贪婪的?
会修改输出:
>>> re.compile(r"if(.*?)XYZ").search("if a if b if c XYZ").group(1)
' a if b if c '
>>> re.compile(r"if(.*?)XYZ").search("if a XYZ if b if c XYZ").group(1)
' a '
非贪婪的?
仅在搜索的右侧操作。您可以使用
re.sub(r'(?m)^(\s*if\s*)(\(.*(?:\n(?!\s*if\s*\().*)*)//\s*(\w+)\s*$', r'\1(\2 || \3)', s)
看
详细信息
-(?m)
标志re.m
-行的开头^
-第1组:(\s*if\s*)
包含0+空格if
-第2组:(\(.*(:\n(?!\s*if\s*()*)
-a\(
(
-行的其余部分*
-0次或多次重复(?:\n(?!\s*if\s*\()*)
-一个换行符LF,后面不跟\n(?!\s*if\s*\()
,if后面加0+空格,然后跟if
(
-行的其余部分*
-/\s*
和0+空格/
-第3组:1个或多个单词字符(\w+)
-0+空格和行尾\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)
{
...
但是在这种情况下,c不是单独的,它应该被发现,就像如果b,如果c,而不是cis,那么有可能是反向正则表达式匹配,我首先找到XYZ_变量,然后返回,直到找到第一个if条件?看起来你在试着解析一种编程语言。你确定不想使用实际的解析器吗?然后你就可以把它当作一个语法树来使用了。@jpmc26这个反向正则表达式我只想尝试一下,这样我就可以在这里找到我的问题的答案。我还尝试了消极查找和积极查找,它们没有做多行查找。如果你的
如果s总是作为第一行出现,请使用re.findall(r'(?m)^\s*(如果\s*\()(.*(::\n(?!\s*如果\s*\()*)/\s*(XYZ\u变量)),文本)
@WiktorStribiżew我做了一个小把戏,找到所有if条件并搜索每个结果以查找这个正则表达式,但我的问题开始了。我如何将它写回同一个文件?很好地解释道。我也尝试过查找。那么,是否可以尝试使用多行查找后面?对于同一个问题。@fastlearner不知道您在说什么布特,你不需要在这里留神。