正则表达式模式在单个语句中处理区分大小写和不区分大小写

时间:2016-05-19 07:55:18

标签: python regex

我有一个小的正则表达式来处理。

我有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

我如何实现上述目标?

2 个答案:

答案 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匹配foobarFOObar,但不匹配fooBAR。所以回答你的问题:

>>> re.sub('(?i:United States)|US', 'USA', 'united states and US and us')
'USA and USA and us'

请注意,这仅适用于Python 3.6 +。