不重新编译的不区分大小写的正则表达式?

Mat*_*Mat 289 python regex case-sensitive case-insensitive

在Python中,我可以使用以下命令编译正则表达式以区分大小写re.compile:

>>> s = 'TeSt'
>>> casesensitive = re.compile('test')
>>> ignorecase = re.compile('test', re.IGNORECASE)
>>> 
>>> print casesensitive.match(s)
None
>>> print ignorecase.match(s)
<_sre.SRE_Match object at 0x02F0B608>
Run Code Online (Sandbox Code Playgroud)

有没有办法做同样的事情,但没有使用re.compile.我在文档中找不到类似Perl的i后缀(例如m/test/i).

Mic*_*ren 498

传递re.IGNORECASEflags的PARAM search,matchsub:

re.search('test', 'TeSt', re.IGNORECASE)
re.match('test', 'TeSt', re.IGNORECASE)
re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)

  • 使用命名参数“flags”作为“re.sub”非常重要,否则会将“re.IGNORECASE”传递给“count”参数(另见/sf/ask/2980701/带有标志的子项不替换所有出现的情况) (5认同)
  • @Abhijeet 在这种情况下你真的不应该使用 try/ except 。首先检查是否有任何字符串为“None”。 (4认同)
  • `re.match('test', 'TeSt', re.IGNORECASE)` 可能会在任一属性为 `None` 时导致 `TypeError`。使用 `try &amp; except` 来捕获通过 first_string == second_string 匹配的 `TypeError`。**示例代码** `def equal_ignore_case(first_string, second_string): try: return re.match(first_string, second_string, re.IGNORECASE) is not None except (AttributeError, TypeError): return first_string == second_string` [演示代码] (https://repl.it/FWih) (2认同)
  • 或者:“re.I”简写。 (2认同)

aem*_*999 92

您还可以使用搜索/匹配执行不区分大小写的搜索,而不使用IGNORECASE标志(在Python 2.7.3中测试):

re.search(r'(?i)test', 'TeSt').group()    ## returns 'TeSt'
re.match(r'(?i)test', 'TeSt').group()     ## returns 'TeSt'
Run Code Online (Sandbox Code Playgroud)

  • 我们去了 - 我查看了1.5的文档并发现它记录了此页面的大约60%:https://docs.python.org/release/1.5/lib/node65.html#SECTION005210000000000000000我还检查了1.4文档,没有提到这个功能.所以我猜它是在1.5中添加的,当时``regex`模块被弃用而支持`re`模块. (4认同)
  • 这是一个很好的解决方案,因为它不需要标志.在我的情况下,我在Redis中存储搜索字符串,这非常有用. (3认同)
  • @Private:从概念上讲,它确实在*whole*regex上设置了re.I标志 - 而不仅仅是它前面的捕获组.请注意`re.match(r'''A((?i)B)C''',"ab c").group(0)`会对所有内容(A和C)造成不区分大小写的匹配,而不是就在B!如果您只想在特定捕获组上匹配大小写,那么这不是您正在寻找的机器人. (3认同)
  • 文档没有提到在任何特定版本中添加的功能(相反,比如说,(?(条件)是|否)`它说的是在2.4中添加的),所以我希望它一直可用,因为`re`模块的第一个版本,我认为是在1.5中添加的.基本上从一开始就涉及Python的所有意图和目的.它记录了本页第一部分的一半:https://docs.python.org/2/library/re.html#regular-expression-syntax (2认同)
  • @Private:是的,完全可以。我的观点是,从概念上讲,这与设置标志相同。在整个正则表达式上。甚至是它之前的组(!)。没有语法说“仅在以下捕获组上不区分大小写”。 (2认同)
  • @smci 我认为这应该在答案本身中进行编辑。 (2认同)

Ray*_*ger 46

不区分大小写的标记(?i)可以直接合并到正则表达式模式中:

>>> import re
>>> s = 'This is one Test, another TEST, and another test.'
>>> re.findall('(?i)test', s)
['Test', 'TEST', 'test']
Run Code Online (Sandbox Code Playgroud)

  • 这种“(?i)”方法的优点还在于您可以创建正则表达式列表,其中一些不区分大小写,有些不区分大小写。(当然,如果您愿意,您可以将“re.compile”映射到该列表上。) (3认同)
  • 更好的选择,使得正则表达式可以跨平台和意图移植,声明清晰 (2认同)
  • @RomainVincent 更便携,因为您可以复制粘贴模式本身并在其他地方使用它。但我还不确定我是否喜欢这种方法。 (2认同)

小智 12

对于不区分大小写的正则表达式(Regex):有两种方法可以在代码中添加:

  1. flags=re.IGNORECASE

    Regx3GList = re.search("(WCDMA:)((\d*)(,?))*", txt, re.IGNORECASE)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 不区分大小写的标记(?i)

    Regx3GList = re.search("**(?i)**(WCDMA:)((\d*)(,?))*", txt)
    
    Run Code Online (Sandbox Code Playgroud)


pan*_*ish 10

您还可以在模式编译期间定义不区分大小写:

pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)

  • 有助于快速滚动的. (6认同)
  • 在问题OP中使用它并询问是否有另一种方法可以做到这一点. (4认同)

Dou*_*eco 8

在进口

import re
Run Code Online (Sandbox Code Playgroud)

在运行时处理:

RE_TEST = r'test'
if re.match(RE_TEST, 'TeSt', re.IGNORECASE):
Run Code Online (Sandbox Code Playgroud)

需要说明的是,不使用re.compile是浪费。每次调用上述匹配方法时,都会编译正则表达式。这在其他编程语言中也是错误的做法。下面是更好的做法。

在应用程序初始化中:

self.RE_TEST = re.compile('test', re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)

在运行时处理:

if self.RE_TEST.match('TeSt'):
Run Code Online (Sandbox Code Playgroud)

  • OP字面上要求_不_使用`re.compile()`的解决方案...... (2认同)

thi*_*ava 7

要执行不区分大小写的操作,请提供 re.IGNORECASE

>>> import re
>>> test = 'UPPER TEXT, lower text, Mixed Text'
>>> re.findall('text', test, flags=re.IGNORECASE)
['TEXT', 'text', 'Text']
Run Code Online (Sandbox Code Playgroud)

如果我们想替换匹配大小写的文本......

>>> def matchcase(word):
        def replace(m):
            text = m.group()
            if text.isupper():
                return word.upper()
            elif text.islower():
                return word.lower()
            elif text[0].isupper():
                return word.capitalize()
            else:
                return word
        return replace

>>> re.sub('text', matchcase('word'), test, flags=re.IGNORECASE)
'UPPER WORD, lower word, Mixed Word'
Run Code Online (Sandbox Code Playgroud)


jac*_*nye 5

#'re.IGNORECASE' for case insensitive results short form re.I
#'re.match' returns the first match located from the start of the string. 
#'re.search' returns location of the where the match is found 
#'re.compile' creates a regex object that can be used for multiple matches

 >>> s = r'TeSt'   
 >>> print (re.match(s, r'test123', re.I))
 <_sre.SRE_Match object; span=(0, 4), match='test'>
 # OR
 >>> pattern = re.compile(s, re.I)
 >>> print(pattern.match(r'test123'))
 <_sre.SRE_Match object; span=(0, 4), match='test'>
Run Code Online (Sandbox Code Playgroud)