ChatGPT解决这个技术问题 Extra ChatGPT

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

在 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>

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

您可以在以下位置找到关于常规专家的精彩介绍:python-course.eu/re.php

M
Mark Amery

re.IGNORECASE 传递给 searchmatchsubflags 参数:

re.search('test', 'TeSt', re.IGNORECASE)
re.match('test', 'TeSt', re.IGNORECASE)
re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)

当任一属性为 None 时,re.match('test', 'TeSt', re.IGNORECASE) 可能会导致 TypeError。使用 try & 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 Demo Code
@Abhijeet 在这种情况下,您真的不应该使用 try/except 。只需首先检查是否有任何字符串是 None
re.sub 使用命名参数 flags 很重要,否则它会将 re.IGNORECASE 传递给 count 参数(同样是 stackoverflow.com/questions/42581/…
或:re.I 速记。
a
aem999

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

re.search(r'(?i)test', 'TeSt').group()    ## returns 'TeSt'
re.match(r'(?i)test', 'TeSt').group()     ## returns 'TeSt'

该文档没有提及在任何特定版本中添加的功能(与它所说的在 2.4 中添加的 (?(condition)yes|no) 相反),所以我希望它自 re 模块的第一个版本以来一直可用,我认为是在 1.5 中添加的。基本上从一开始就涉及到 Python 的所有意图和目的。它记录在本页第一部分的一半左右:docs.python.org/2/library/re.html#regular-expression-syntax
开始吧 - 我查看了 1.5 的文档,发现它记录了该页面大约 60% 的内容:docs.python.org/release/1.5/lib/…我还查看了 1.4 文档,其中没有提及此功能。所以我猜它是在 1.5 中添加的,当时不推荐使用 regex 模块以支持 re 模块。
这是一个很好的解决方案,因为它不需要标志。就我而言,我将搜索字符串存储在 Redis 中,这真的很有帮助。
@Private:从概念上讲,它确实在 entire 正则表达式上设置了 re.I 标志 - 而不仅仅是它之前的捕获组。请注意,re.match(r'''A ((?i)B) C''', "a b c").group(0) 会导致对所有内容(A 和 C)进行不区分大小写的匹配,而不仅仅是在 B 上!如果您只想在特定捕获组上进行大小写匹配,那么这不是您要寻找的机器人。
@smci 我认为这应该在答案本身中进行编辑。
R
Raymond Hettinger

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

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

更好的选择,使正则表达式可跨平台移植,并且在声明时意图明确
这种 '(?i)' 方法还有一个优点,即您可以创建一个正则表达式列表,其中一些不区分大小写,而另一些则不区分大小写。 (当然,如果您愿意,您可以将 re.compile 映射到该列表上。)
@SinaMadani 我很困惑。它比 flags=re.IGNORECASE 更便携吗?
@RomainVincent 更便携,因为您可以复制粘贴模式本身并在其他地方使用它。我还不确定我是否喜欢这种方法。
@RoboRobok 啊,是的,我没有这样想。感谢你的回复!
M
Mark Amery

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

pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)

在问题中,OP 使用了这个并询问是否有另一种方法可以做到这一点。
对快速滚动的人很有帮助。
w
wpercy

在进口

import re

在运行时处理:

RE_TEST = r'test'
if re.match(RE_TEST, 'TeSt', re.IGNORECASE):

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

在应用程序初始化中:

self.RE_TEST = re.compile('test', re.IGNORECASE)

在运行时处理:

if self.RE_TEST.match('TeSt'):

谢谢!没有人谈论过编译,但它是最聪明的选择!
OP 从字面上要求一个使用 re.compile().... 的解决方案
t
this.srivastava

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

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

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

>>> 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'

P
Paul Roub

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

flags=re.IGNORECASE Regx3GList = re.search("(WCDMA:)((\d*)(,?))*", txt, **re.IGNORECASE**) 不区分大小写的标记 (?i) Regx3GList = re.search("**(?i)**(WCDMA:)((\d*)(,?))*", txt)


j
jackotonye
#'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'>

D
Dat

如果您想替换但仍保留以前 str 的样式。有可能的。

例如:突出显示字符串“test asdasd TEST asd tEst asdasd”。

sentence = "test asdasd TEST asd tEst asdasd"
result = re.sub(
  '(test)', 
  r'<b>\1</b>',  # \1 here indicates first matching group.
  sentence, 
  flags=re.IGNORECASE)

测试 asdasd 测试 asd 测试 asdasd