如何在不区分大小写的情况下匹配字符串中的子字符串


72

我正在寻找Python中忽略大小写字符串的比较。

我尝试过:

if line.find('mandy') >= 0:

但忽略案例没有成功。我需要在给定的文本文件中找到一组单词。我正在逐行读取文件。一行上的单词可以是mandyMandyMANDY等(我不想使用toupper/tolower等)。

我正在寻找下面的Perl代码的Python等效项。

if ($line=~/^Mandy Pande:/i)

Answers:


137

如果您不想使用str.lower(),则可以使用正则表达式

import re

if re.search('mandy', 'Mandy Pande', re.IGNORECASE):
    # Is True

1
re.search(pattern,string,flags = 0)docs.python.org/3/library/re.html#re.search扫描字符串以查找正则表达式模式产生匹配项的第一个位置,并返回对应的匹配对象。如果字符串中没有位置与模式匹配,则返回None;否则,返回None。请注意,这与在字符串中的某个点找到零长度匹配不同。
kr85

24

还有另一篇文章在这里。尝试看看这个。

顺便说一句,您在寻找.lower()方法:

string1 = "hi"
string2 = "HI"
if string1.lower() == string2.lower():
    print "Equals!"
else:
    print "Different!"

5
不,他不是。“ [我不想使用上/下等。”
弗雷德里克·皮尔

1
我知道,我阅读了,但是re.match和re.search解决方案不检查正则表达式中使用的特殊字符,例如()或[]
Samuele Mattiuzzo

()或[]与问题有什么关系?
Fredrik Pihl

这不是更笼统的答案,因为较低/较高的解决方案不适用于Unicode。

2
如果您真的不需要避免这种情况(由于某些原因,例如unicode),则使用lower()进行缓存比使用正则表达式匹配要有效得多。
Ozgur Ozturk


5
a = "MandY"
alow = a.lower()
if "mandy" in alow:
    print "true"

解决


3

您还可以使用: s.lower() in str.lower()


2
OP表示“我不想使用上/下等
Gino Mempin

2
import re
if re.search('(?i)Mandy Pande:', line):
    ...

如果我没记错的话,这不会检查/匹配正则表达式中的控制字符,例如[]或()...
Samuele Mattiuzzo


2

您可以将in运算符与lower字符串方法结合使用。

if "mandy" in line.lower():

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.