基于Python中的几个正则表达式规则进行替换

时间:2016-03-17 11:06:37

标签: python regex

我想使用例如这种模式

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

使用re.sub()

有一些例子如this,但它不适用于正则表达式特殊字符。

4 个答案:

答案 0 :(得分:2)

您应该像raw strings那样使用:

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

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

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

  

正则表达式使用反斜杠字符('\')来表示   特殊形式或允许使用特殊字符   唤起他们的特殊意义。这与Python的使用相冲突   字符串文字中用于相同目的的相同字符;对于   例如,要匹配文字反斜杠,可能必须写'\\'   作为模式字符串,因为正则表达式必须是\,和   每个反斜杠必须表示为常规Python字符串中的\   文字。

以及如何解决它(文档的另一个引用):

  

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

当然,在声明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 demo

答案 3 :(得分:1)

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

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

直接来自正则表达式模块(重新)documentation

  

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

>>> re.match(r"\W(.)\1\W", " 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 ...>