我有一个小的正则表达式要处理。我有两个不同的术语。
我想在单个正则表达式替换语句中执行以下两个正则表达式替换。
clntxt = re.sub('(?i)United States', 'USA', "united states")
# Output: USA
clntxt = re.sub('US', 'USA', "US and us")
# output: USA and us
Run Code Online (Sandbox Code Playgroud)
我需要类似的东西
clntxt = re.sub('(?i)United States|(?s)US', 'USA', "united states and US and us")
# output: USA and USA and us
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现上述目标?
在旧版 Python 版本中,为整个表达式(?i)打开“忽略大小写”标志。来自官方文档:
(?aiLmsux)
(来自集合“a”、“i”、“L”、“m”、“s”、“u”、“x”中的一个或多个字母。)该组与空字符串匹配;这些字母设置相应的标志:re.A(仅 ASCII 匹配)、re.I(忽略大小写)、re.L(区域设置相关)、re.M(多行)、re.S(点匹配所有)和 re.X(详细),用于整个正则表达式。(这些标志在模块内容中进行了描述。)如果您希望将标志作为正则表达式的一部分包含在内,而不是将标志参数传递给 re.compile() 函数,则这非常有用。应首先在表达式字符串中使用标志。
然而,从 Python 3.6 开始,您可以在表达式的一部分内切换标志:
(?imsx-imsx:...)
(“i”、“m”、“s”、“x”集合中的零个或多个字母,可选地后跟“-”,后跟同一集合中的一个或多个字母。)这些字母设置或删除相应的标志:re.I(忽略大小写)、re.M(多行)、re.S(点匹配所有)和 re.X(详细),用于表达式的部分。(模块内容中描述了这些标志。)
3.6 版本中的新功能。
例如,(?i:foo)bar匹配foobar和FOObar但不匹配fooBAR。所以回答你的问题:
>>> re.sub('(?i:United States)|US', 'USA', 'united states and US and us')
'USA and USA and us'
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于 Python 3.6+。