转义正则表达式字符串

2024-11-28 08:37:00
admin
原创
4
摘要:问题描述:我想使用用户的输入作为正则表达式模式来搜索某些文本。这可行,但我该如何处理用户输入在正则表达式中有意义的字符的情况?例如,用户想要搜索 Word (s):正则表达式引擎会将(s)作为一个组。我希望它将其视为字符串"(s)" 。我可以replace根据用户输入运行并将 替换(为(并...

问题描述:

我想使用用户的输入作为正则表达式模式来搜索某些文本。这可行,但我该如何处理用户输入在正则表达式中有意义的字符的情况?

例如,用户想要搜索 Word (s):正则表达式引擎会将(s)作为一个组。我希望它将其视为字符串"(s)" 。我可以replace根据用户输入运行并将 替换((并将 替换))但问题是我需要对每个可能的正则表达式符号进行替换。

您知道一些更好的方法吗?


解决方案 1:

使用该re.escape()函数实现此目的:

4.2.3re模块内容

转义(字符串)

返回所有非字母数字都带有反斜杠的字符串;如果您想要匹配可能包含正则表达式元字符的任意文字字符串,这很有用。

一个简单的例子,搜索任何出现的提供的字符串(可选后跟“s”),并返回匹配对象。

def simplistic_plural(word, text):
    word_or_plural = re.escape(word) + 's?'
    return re.match(word_or_plural, text)

解决方案 2:

您可以使用re.escape()

re.escape(string) 返回所有非字母数字都带有反斜杠的字符串;如果您想匹配可能包含正则表达式元字符的任意文字字符串,这很有用。

>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'

如果您使用的 Python 版本 <3.7,这将转义属于正则表达式语法的非字母数字。

如果您使用的 Python 版本 < 3.7 但 >= 3.3,这将转义不属于正则表达式语法的非字母数字,但特殊下划线 ( )除外_

解决方案 3:

不幸的是,re.escape()不适合替换字符串:

>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'

一个解决方案是将替换放入 lambda 中:

>>> re.sub('a', lambda _: '_', 'aa')
'__'

因为 lambda 的返回值被视为re.sub()文字字符串。

解决方案 4:

re.escape做得太多了,它还会转义空格、反斜杠……

仅转义正则表达式特殊字符][()?*+.^$

import re

def regex_escape_fixed_string(string):
    "escape fixed string for regex"
    if type(string) == bytes:
        return re.sub(rb"[][(){}?*+.^$]", lambda m: b"\\\" + m.group(), string)
    return re.sub(r"[][(){}?*+.^$]", lambda m: "\\\" + m.group(), string)

assert (
    regex_escape_fixed_string("a[b]c(d)e{f}g?h*i+j.k^l$m") ==
    'a\\[b\\]c\\(d\\)e\\{f\\}g\\?h\\*i\\+j\\.k\\^l\\$m'
)

解决方案 5:

通常,对输入到正则表达式的字符串进行转义会使正则表达式从字面上考虑这些字符。记住,通常您在计算机中输入字符串,然后计算机插入特定字符。当您在编辑器中看到它时`
,它实际上不是一个新行,直到解析器决定它是。它是两个字符。一旦您将其传递出去,pythonprint就会显示它并将其解析为一个新行,但在编辑器中看到的文本中,它可能只是反斜杠字符后跟 n。如果您
"
"这样做,那么 python 将始终将其解释为您输入的原始内容(据我所知)。使事情进一步复杂化的是,正则表达式还有另一种语法/语法。正则表达式解析器对它接收的字符串的解释与 python 的打印不同。我相信这就是为什么我们建议传递像r"(
+)-- 这样的原始字符串,以便正则表达式接收您实际输入的内容。但是,正则表达式将收到一个括号,并且不会将其作为文字括号进行匹配,除非您使用**正则表达式自己的语法规则**明确告诉它。为此,您需要r"( un ( x : nat ) :)"`在这里第一个括号将不会匹配,因为它是一个捕获组,因为缺少反斜杠,但第二个括号将作为文字括号进行匹配。

因此,我们通常会re.escape(regex)转义那些我们想要按字面意思解释的东西,也就是那些通常会被正则表达式解析器忽略的东西,例如括号、空格等,这些都会被转义。例如我的应用程序中的代码:

    # escapes non-alphanumeric to help match arbitrary literal string, I think the reason this is here is to help differentiate the things escaped from the regex we are inserting in the next line and the literal things we wanted escaped.
    __ppt = re.escape(_ppt)  # used for e.g. parenthesis ( are not interpreted as was to group this but literally

例如查看这些字符串:

_ppt
Out[4]: '(let H : forall x : bool, negb (negb x) = x := fun x : bool =>HEREinHERE)'
__ppt
Out[5]: '\\(let\\ H\\ :\\ forall\\ x\\ :\\ bool,\\ negb\\ \\(negb\\ x\\)\\ =\\ x\\ :=\\ fun\\ x\\ :\\ bool\\ =>HEREinHERE\\)'
print(rf'{_ppt=}')
_ppt='(let H : forall x : bool, negb (negb x) = x := fun x : bool =>HEREinHERE)'
print(rf'{__ppt=}')
__ppt='\\(let\\ H\\ :\\ forall\\ x\\ :\\ bool,\\ negb\\ \\(negb\\ x\\)\\ =\\ x\\ :=\\ fun\\ x\\ :\\ bool\\ =>HEREinHERE\\)'

我相信双反斜杠的存在是为了让正则表达式收到一个文字反斜杠。


顺便说一句,我很惊讶它打印的是双反斜杠而不是单反斜杠。如果有人能对此发表评论,我将不胜感激。我还想知道现在如何在正则表达式中匹配文字反斜杠。我假设它是 4 个反斜杠,但老实说,由于原始字符串 r 构造,我原本预计只需要 2 个。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   642  
  引言在当今快速变化的科技市场中,企业要想保持竞争力,就必须具备高效的产品开发流程。小米作为一家以创新驱动的科技公司,其集成产品开发(IPD)流程在业界颇受关注。其中,技术路线图规划作为IPD流程的核心环节,对于确保产品技术领先、满足市场需求以及实现长期战略目标至关重要。本文将深入探讨小米IPD流程中的技术路线图规划,分...
华为IPD是什么   0  
  在当今快速变化的商业环境中,项目管理的高效执行是企业成功的关键。为了应对日益复杂的产品开发挑战,企业纷纷寻求将产品开发流程(Product Development Process, PDCP)与集成产品开发(Integrated Product Development, IPD)流程相结合的策略,以实现更高效、更协同的...
IPD管理   0  
  在当今竞争激烈的市场环境中,提高客户满意度是企业持续发展和成功的关键。为了实现这一目标,企业需要不断优化其产品开发和管理流程。IPD(Integrated Product Development,集成产品开发)流程图作为一种高效的项目管理工具,能够帮助企业实现跨部门协作、优化资源配置,并最终提升客户满意度。本文将深入探...
IPD流程是谁发明的   0  
  在项目管理领域,集成产品开发(IPD, Integrated Product Development)流程被视为提升项目成功率的关键框架。IPD通过其系统化的方法,将产品开发过程中的各个阶段紧密连接,确保从概念到市场的每一步都经过深思熟虑和高效执行。本文将深入探讨IPD流程的六个核心阶段如何深刻影响项目成功,并为项目管...
IPD流程中CDCP   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用