根据 Python 中的几个正则表达式规则进行替换



例如,我想使用这种模式

    rules = {
        's': '_',
        '.(?P<word>w)': '1',
        'text1': 'text2',
        #etc
    }

使用 re.sub()

有一些这样的例子,但它不适用于正则表达式特殊查克器。

我在 python 中使用正则表达式时使用原始字符串。使您不必转义特殊字符:https://docs.python.org/2/library/re.html
尝试:

rules = {
    r"s": r"_",
    r"text1": r"text2",
    #etc
}

你应该像这样使用原始字符串:

rules = {
    r's': r'_',
    r'.(?P<word>w)': r'1',
    r'text1': r'text2',
    #etc
}

这意味着您不需要转义特殊字符

这是它发生的原因(直接引用自文档):

正则表达式使用反斜杠字符 ('\') 来指示 特殊形式或允许使用特殊字符而不使用 援引它们的特殊意义。这与 Python 的用法相冲突 字符串文本中用于相同目的的相同字符;为 例如,要匹配文字反斜杠,可能必须编写"\\" 作为模式字符串,因为正则表达式必须是 \,并且 每个反斜杠必须在常规 Python 字符串中表示为 \ 字面。

以及如何解决它(文档中的另一句话):

解决方案是使用Python的原始字符串表示法进行常规 表达模式;反斜杠不以任何特殊方式处理 以 'r' 为前缀的字符串文本。所以r"n"是一个两个字符的字符串 包含 '''n' ,而 "n" 是一个单字符字符串 包含换行符。通常模式会用Python表示 使用此原始字符串表示法的代码。

当然,在声明 Python 正则表达式时需要使用原始字符串,并且您的示例存在一些问题,但您对如何运行正则表达式替换感兴趣。

我建议使用OrderedDict,以便可以按照字典中定义的严格顺序执行替换。然后,代码将如下所示

import re
from collections import OrderedDict  # adding the import
rules=OrderedDict()                  # defining the regex
rules[r's'] = '-'                   #  replacement
rules[r'.(w)'] = r'1'              #  pairs
rules['text1'] = 'text2'             #  here
s = "nnoo  mmoorree  tteexxtt11"     # a test string
for key in rules.keys():             # iterating through keys
    s = re.sub(key, rules[key], s)   # perform the S&R
print(s)                             # Demo printing

查看 IDEONE 演示

使用原始字符串表示法以避免转义特殊字符:

rules = {
    's': '_',
    '.(?P<word>w)': '1',
    'text1': 'text2',
    #etc
}

直接来自正则表达式模块 (re) 文档:

原始字符串表示法 (r"text") 使正则表达式保持理智。如果没有它,正则表达式中的每个反斜杠 ('\') 都必须以另一个反斜杠 ('\) 为前缀才能对其进行转义。例如,以下两行代码在功能上是相同的:

>>> re.match(r"W(.)1W", " ff ")
<_sre.SRE_Match object at ...>
>>> re.match("\W(.)\1\W", " ff ")
<_sre.SRE_Match object at ...>

当想要匹配文字反斜杠时,必须在正则表达式中对其进行转义。使用原始字符串表示法,这意味着 r"\"。如果没有原始字符串表示法,则必须使用"\\",使以下代码行在功能上相同:

>>> re.match(r"\", r"\")
<_sre.SRE_Match object at ...>
>>> re.match("\\", r"\")
<_sre.SRE_Match object at ...>

最新更新