通配符在正则表达式中用作表示或交换一个或多个字符的符号。 这些主要用于简化搜索条件。
本文详细解释了如何在 Python 中使用带有通配符的 re.sub() 来匹配字符串与正则表达式。
Python 中的 re 模块用于对正则表达式 (RegEx) 进行操作。 这些是用于查找一个字符串或一组字符串的唯一字符串。
将文本与特定模式进行比较可以确定它是否存在。
它还可以将一个模式划分为一个或多个子模式。 通过 re 模块在 Python 中提供正则表达式支持。
它的主要目的是在正则表达式中搜索字符串。
在我们了解如何在 Python 中使用带有通配符的 re.sub()
之前,让我们学习一下 re.sub() 函数在普通字符串语句上的实现。
re.sub()
函数用字符串替换给定文本中的一个或多个匹配项。
re.sub(pattern, repl, string, count=0, flags=0)
它返回通过用替换 repl 替换字符串中模式最左边的非重叠事件而创建的字符串。
在没有匹配的情况下,字符串以其原始形式返回。 如果 repl 是字符串,则处理任何反斜杠转义。 repl 也可以是一个函数。
让我们理解下面的代码示例。
import re
rex = '[0-9]+'
string_reg = 'ID - 54321, Pay - 586.32'
repl = 'NN'
print('Original string')
print(string_reg)
result = re.sub(rex, repl, string_reg)
print('After replacement')
print(result)
代码的作用:
result = re.sub(rex, repl, string_reg)
输出:所有数字都被替换为“NN”,而所有字母数字都保持不变。
Original string
ID - 54321, Pay - 586.32
After replacement
ID - NN, Pay - NN.NN
本文主要关注四种类型的通配符—— .
(点)、*
、?
和 +
。 了解它们各自的作用对于学习如何在 Python 中使用带有通配符的 re.sub() 非常重要。
.
(点) - 将 re.sub
与 .
Python 中的通配符匹配除新行之外的任何字符。 下面程序中引入了re模块,在一个字符串变量string_reg中存放了三个字符串实例。将 re.sub()
与 .
在 Python 中使用通配符时,string_reg 变量会被 re.sub() 函数返回的结果覆盖。 当点与新字符匹配时,程序会搜索模式 ad 以及在 ad 之后重复的任意数量的 d。
在输出中可以看出,每次程序找到模式 ad. 时,都会将其替换为 REMOVED。
import re
string_reg = 'a23kaddhh234 ... add2asdf675 ... xxxadd2axxx'
string_reg = re.sub(r'ad.', 'REMOVED ', string_reg)
print(string_reg)
输出:
a23kREMOVED hh234 ... REMOVED 2asdf675 ... xxxREMOVED 2axxx
*
) - 在 Python 中使用带有此通配符的 re.sub()
来为前面的 RE 提供尽可能多的重复,在结果 RE 中匹配 0 次或更多次重复。例如,ad* 匹配字母“a”、“ad”或后跟任意数量的 d 的“a”。
可以在此处的输出中看到,“a”和“ad”的每个实例都被关键字“PATCH”替换。
import re
string_reg = 'a23kaddhh234 ... add2asdf675 ... xxxadd2axxx'
string_reg = re.sub(r'ad*', 'PATCH', string_reg)
print(string_reg)
输出:
PATCH23kPATCHhh234 ... PATCH2PATCHsdf675 ... xxxPATCH2PATCHxxx
+
- 在 Python 中使用带有此通配符的 re.sub() 来匹配新 RE 中先前 RE 的 1 次或多次重复。 Ad+ 不会匹配 ‘a’; 相反,它匹配 ‘a’ 后跟任何非零数的 d。该函数搜索模式“ad…”,其中“…”表示后续 RE“d”的重复编号,并将其替换为“POP”。
import re
string_reg = 'a23kaddhh234 ... add2asdf675 ... xxxadd2axxx'
string_reg = re.sub(r'ad+', 'POP', string_reg)
print(string_reg)
输出:
a23kPOPhh234 ... POP2asdf675 ... xxxPOP2axxx
?
- 使下一个 RE 匹配前一个 RE 的 0 或 1 次重复。 模式 ad? 匹配“a”或“ad”。该程序找到“a”或“ad”的实例并将它们替换为正则表达式 (REGEX)“POP”。
import re
string_reg = 'a23kaddhh234 ... add2asdf675 ... xxxadd2axxx'
string_reg = re.sub(r'ad?', 'POP', string_reg)
print(string_reg)
输出:
POP23kPOPdhh234 ... POPd2POPsdf675 ... xxxPOPd2POPxxx
有时,在 Python 中使用带通配符的 re.sub() 仅使用一个量词不足以获得所需的结果。 组合量词可以将更复杂的模式传递给系统。
让我们了解其中的一些。
*?
、+?
、??
- 在前面的示例中,我们了解了“.
”、“+
”、“*
”量词。 它们都是贪心的,意味着它们匹配尽可能多的文本。
例如,如果 RE<.*>
与 b
匹配,它将匹配完整的字符串而不是仅仅匹配 ,这通常不是所需的行为。
?
最后添加量词来解决这个问题。 量词指示它以最小或非贪婪的方式进行匹配,这意味着匹配的字符最少。
import re
string_reg = 'as56ad5 ... dhgasd55df ... xxxadd2axxx'
string_reg = re.sub(r'ad*?', 'SUGAR', string_reg)
print(string_reg)
输出:ad*?
量词只搜索“a”的实例。
SUGARs56SUGARd5 ... dhgSUGARsd55df ... xxxSUGARdd2SUGARxxx
对于 ad+?:
它只搜索“ad”的实例。
as56SUGAR5 ... dhgasd55df ... xxxSUGARd2axxx
对于 ad??:
它还只搜索“a”的实例。
SUGARs56SUGARd5 ... dhgSUGARsd55df ... xxxSUGARdd2SUGARxxx
*+
、++
、?+
(也称为所有格量词)- 类似于“*
”、“+
”和“?
” 量词,带有“+
”的量词尽可能频繁地匹配。
当它后面的表达式不匹配时,这些不允许像贪婪量词那样进行回溯。 这种类型的量词称为所有格量词。
例如,a*a
将匹配“aaaa”,因为 a*
匹配所有四个 a,但是当遇到最后一个“a”时,表达式回溯,a*
总共只匹配三个 a 和最后一个“a” 匹配第四个“a”。
但是当表达式 a*+a
用来匹配 “aaaa” 时,a*+
会匹配所有四个 “a”,但是它不能回溯,不会匹配到最后的 “a”,因为它找不到更多 要匹配的字符。
x*+
、x++
和 x?+
的等价物分别是 (?>x*)
、(?>x+)
和 (?>x?)
。 让我们看一下程序以更好地理解这个概念。
import regex
string_reg = 'as56ad5 ... dhgasd55df ... xxxadd2axxx'
string_reg = regex.sub(r'ad*+', 'SUGAR', string_reg)
print(string_reg)
注意
:re 模块不支持所有格量词。 请改用 regex()
模块。
输出:查找 a 或 ‘adddd…’ 的实例。
SUGARs56SUGAR5 ... dhgSUGARsd55df ... xxxSUGAR2SUGARxxx
对于 ad++:
查找“ad”或“adddd…”的实例。
as56SUGAR5 ... dhgasd55df ... xxxSUGAR2axxx
对于 ad+?:
与 ad++
的行为相同。
as56SUGAR5 ... dhgasd55df ... xxxSUGARd2axxx
我们已经学习了如何在 Python 中使用带有通配符的 re.sub()
。 现在我们将结合使用这些概念来搜索正则表达式中的字符串模式并替换整个单词而不仅仅是字符串模式。
问题陈述向我们展示了一个字符串和一个模式。 需要在给定的字符串中搜索模式。
一旦找到,re.sub()
函数将替换整个单词。
string_reg = """\
... 23khadddddh234 > REMOVED23khh234
... add2asdf675 > REMOVED2asdf675""
该函数需要在字符串中找到一个模式,找到后替换整个字符串。 要查找的模式是“添加”,因此使用量词的组合来实现所需的结果。
该组合应采用与“ad”、“add”或“addddd”相匹配的方式。 但是,add23khh234 和 add2asdf675 都不匹配。
最好的方法是使用 add.+?
。
string_reg = re.sub(r'add.+? ', 'REMOVED ', string_reg)
代码
import re
string_reg = """\
... 23khadddddh234 > REMOVED23khh234
... add2asdf675 > REMOVED2asdf675"""
string_reg = re.sub(r'add.+? ', 'REMOVED ', string_reg)
print(string_reg)
输出:程序搜索“ad…”,找到后将其替换为 repl“REMOVED”。 如果“ad…”出现在开头,它会替换整个单词。
... 23khREMOVED > REMOVED23khh234
... REMOVED > REMOVED2asdf675
生动描述了如何在Python中使用带通配符的 re.sub()
。 本文的第一部分侧重于将 Python 函数 re.sub 与简单的 REGEX 结合使用。
然后详细解释了在 re.sub()
中使用通配符的概念。
阅读本文后,读者可以轻松地在 Python 中使用带有通配符的 re.sub()
并创建在 REGEX 中搜索字符串模式的程序。