【问题标题】:Regular expression to replace "escaped" characters with their originals正则表达式将“转义”字符替换为其原始字符
【发布时间】:2013-05-31 21:33:14
【问题描述】:

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

TL;DR

我有类似的字符串

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

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

A sentence with an exclamation! Next is a * character

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

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

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

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

r.sub("-", s)

这应该是:

test - - test * !! **

但它什么也没做。我在这里遗漏了什么吗?

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

\\\*

\\!

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

【问题讨论】:

    标签: python regex parsing markup


    【解决方案1】:

    你遗漏了一些东西,即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 * !! **'
    

    【讨论】:

    • 感谢您简洁明了的回复。我的印象是,python 中的三重引号意味着从字面上理解字符串(如 ... 尽可能字面意思)。不知道为什么,但现在我知道这就是 r 前缀的作用。谢谢!
    • 三引号可以很容易地包含换行符和单引号而无需转义;您也可以将原始引用和三重引用结合起来。 :-)
    猜你喜欢
    • 2021-10-02
    • 2019-10-24
    • 2013-04-03
    • 1970-01-01
    相关资源
    最近更新 更多