繁体   English   中英

多个正则表达式搜索和替换

[英]Multiple Regex Search and Replace

我正在尝试创建一个简单的脚本,该脚本将从文件中获取正则表达式,然后对另一个文件进行搜索和替换。 这是我所拥有的,但不起作用,文件未更改,我在做什么错?

import re, fileinput

separator = ' => '

file = open("searches.txt", "r")

for search in file:
    pattern, replacement = search.split(separator)
    pattern = 'r"""' + pattern + '"""'
    replacement = 'r"""' + replacement + '"""'
    for line in fileinput.input("test.txt", inplace=1):
        line = re.sub(pattern, replacement, line)
        print(line, end="")

文件search.txt看起来像这样:

<p (class="test">.+?)</p> => <h1 \1</h1>
(<p class="not">).+?(</p>) => \1This was changed by the script\2

test.txt像这样:

<p class="test">This is an element with the test class</p>
<p class="not">This is an element without the test class</p>
<p class="test">This is another element with the test class</p>

我做了一个测试,看是否从文件中正确获取了表达式:

>>> separator = ' => '
>>> file = open("searches.txt", "r")
>>> for search in file:
...     pattern, replacement = search.split(separator)
...     pattern = 'r"""' + pattern + '"""'
...     replacement = 'r"""' + replacement + '"""'
...     print(pattern)
...     print(replacement)
... 
r"""<p (class="test">.+?)</p>"""
r"""<h1 \1</h1>
"""
r"""(<p class="not">).+?(</p>)"""
r"""\1This was changed by the script\2"""

由于某种原因,第一个替换项的结尾三引号在换行符上,这可能是造成我问题的原因吗?

你不需要

pattern = 'r"""' + pattern + '"""'

在对re.sub的调用中, pattern应为实际的正则表达式。 所以<p (class="test">.+?)</p> 当您将所有双引号引起来时,它将使模式永远不会与文件中的文本匹配。

即使您似乎已经看过这样的代码:

replaced = re.sub(r"""\w+""", '-')

在这种情况下, r"""向python解释器指示您正在谈论“原始”多行字符串,或者不应替换反斜杠序列的字符串(例如,用换行符替换\\ n)。程序员经常使用python中的“原始”字符串引用正则表达式,因为它们要使用正则表达式序列(如上面的\\w )而不必引用反斜杠。如果没有原始字符串,则正则表达式必须为'\\\\w+' ,这会造成混淆。

但是,无论如何,您根本不需要三重双引号。 最后一个代码短语可以简单地写成:

replaced = re.sub(r'\w+', '-')

最后,您的另一个问题是您的输入文件中包含换行符,将模式=>替换的每种情况分开。 因此,实际上是“模式=>替换\\ n”,尾随换行符位于替换变量之后。 尝试做:

for search in file:
    search = search.rstrip() #Remove the trailing \n from the input
    pattern, replacement = search.split(separator)

两个观察:

1)像这样读取文件时使用.strip()

pattern, replacement = search.strip().split(separator)

这将从文件中删除\\n

2)如果打算从模式中转义正则表达式元字符,请使用re.escape()而不是所使用的r“”“ + str +”“”形式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM