1

注意:我没有用正则表达式解析很多或 html 或通用 html。我知道那很糟糕

TL;博士

我有像这样的字符串

A sentence with an exclamation\! Next is a \* character

原始标记中有“转义”字符的地方。我希望用他们的“原件”替换它们。并得到:

A sentence with an exclamation! Next is a * character

我需要从一些 wiki 标记中提取少量数据。

我在这里只处理段落/片段,所以我不需要一个强大的解决方案。在python中,我尝试了一个测试:

s = "test \\* \\! test * !! **"

r = re.compile("""\\.""") # Slash followed by anything

r.sub("-", s)

这应该产生:

test - - test * !! **

但它什么也没做。我在这里错过了什么吗?

此外,我不确定如何将任何给定的转义字符替换为其原始字符,因此我可能只会使用特定的正则表达式创建一个列表和子项,例如:

\\\*

\\!

可能有一种更清洁的方法可以做到这一点,因此非常感谢任何帮助。

4

1 回答 1

2

你错过了一些东西,即r前缀:

r = re.compile(r"\\.") # Slash followed by anything

python 和re附加含义到\; 当您将字符串值传递给 时,您的双反斜杠变成了一个反斜杠re.compile(),此时re看到\.,这意味着文字句号。:

>>> print """\\."""
\.

通过使用r''你告诉python不要解释转义码,所以现在re给出了一个带有 的字符串\\.,这意味着一个文字反斜杠后跟任何字符:

>>> print r"""\\."""
\\.

演示:

>>> import re
>>> s = "test \\* \\! test * !! **"
>>> r = re.compile(r"\\.") # Slash followed by anything
>>> r.sub("-", s)
'test - - test * !! **'

经验法则是:在定义正则表达式时,使用r''原始字符串文字,这样您就不必双重转义对 Python 和正则表达式语法都有意义的所有内容。

接下来,您要替换“转义”字符;为此使用组,re.sub()让您引用组作为替换值:

r = re.compile(r"\\(.)") # Note the parethesis, that's a capturing group
r.sub(r'\1', s)          # \1 means: replace with value of first capturing group

现在输出是:

>>> r = re.compile(r"\\(.)") # Note the parethesis, that's a capturing group
>>> r.sub(r'\1', s) 
'test * ! test * !! **'
于 2013-05-31T21:42:32.153 回答