我有一个小的正则表达式来处理。
我有2个不同的术语。
1. United States, which I would like to match ignoring the case
2. US, which I would like to match without ignoring case.
我想在单个正则表达式替换语句中执行以下两个正则表达式替换。
clntxt = re.sub('(?i)United States','USA', "united states") # Output: USA
clntxt = re.sub('US','USA', "US and us") # output: USA and us
我需要像
这样的东西clntxt = re.sub('(?i)United States|(?s)US','USA', "united states and US and us") # output: USA and USA and us
我如何实现上述目标?
答案 0 :(得分:2)
您无法在Python中的模式内的任何位置使用内联i
修饰符。不支持启用或禁用不区分大小写模式的变体。一旦模式中有(?i)
,所有模式都被视为不区分大小写。
在rexegg.com处查看更多详情:
内联修饰符
的非捕获组的内容(?i)
在.NET,PCRE(C,PHP,R ...),Perl,Python,Java和Ruby(但不是JavaScript)中,可以使用内联修饰符(?i)
,例如{ {1}}。有关有关三个附加功能(在Python中不可用)的详细信息,请参阅内联修饰符部分:在中间字符串中打开它,使用(?i)cat
将其关闭,或应用它仅限(?-i)
因此,您只能使用
之类的东西(?i:foo)
并且可能添加单词边界:
'[Uu][nN][Ii][Tt][Ee][Dd] [Ss][Tt][Aa][Tt][Ee][Ss]|US'
答案 1 :(得分:0)
正如WiktorStribiżew所指出的那样,(?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(点匹配all)和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'
请注意,这仅适用于Python 3.6 +。