我想使用例如这种模式
rules = {
'\s': '_',
'.(?P<word>\w)': '\1',
'text1': 'text2',
#etc
}
使用re.sub()
有一些例子如this,但它不适用于正则表达式特殊字符。
答案 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 ...>