我在 Python 的正则表达式中得到了
|
(管道特殊字符)的含义。
它匹配第一个或第二个。
ex :
a|b
匹配 a 或 b.
我的问题: 如果我想在上面的例子中匹配区分大小写的
a
和不区分大小写的 b
怎么办?
例如:
s = "Welcome to PuNe, Maharashtra"
result1 = re.search("punnee|MaHaRaShTrA",s)
result2 = re.search("pune|maharashtra",s)
result3 = re.search("PuNe|MaHaRaShTrA",s)
result4 = re.search("P|MaHaRaShTrA",s)
我想按照我在上面的声明中写的方式搜索浦那
s
即PuNe
。但我必须忽略大小写来搜索马哈拉施特拉邦。如何搜索 1 个区分大小写的单词和其他不区分大小写的单词?因此,result1
、result2
、result3
、result4
将给出 not null
值。
我试过了:
result1 = re.search("pune|MaHaRaShTrA",s1, re.IGNORECASE)
但这忽略了这两个词的大小写。
如何限制 1 个单词区分大小写而其他单词不区分大小写?
在 Python 3.6 及更高版本中,您可以使用 内联修饰符 groups:
>>> s = "Welcome to PuNe, Maharashtra"
>>> print(re.findall(r"PuNe|(?i:MaHaRaShTrA)",s))
['PuNe', 'Maharashtra']
参见相关Python
re
文档:
(?aiLmsux-imsx:...)
(来自集合、'a'
、'i'
、'L'
、'm'
、's'
、'u'
的零个或多个字母,可选地后跟'x'
后跟一个或更多来自'-'
、'i'
、'm'
、's'
的字母。)字母设置或删除相应的标志:'x'
(仅ASCII匹配),re.A
(忽略case),re.I
(locale dependent),re.L
(multi-line),re.M
(dot matches all),re.S
(Unicode matching), andre.U
(详细),用于表达式的一部分。 (标志在模块内容中描述。)re.X
字母
、'a'
和'L'
在用作内联标志时是互斥的,因此它们不能组合或跟在'u'
之后。相反,当其中一个出现在内联组中时,它会覆盖封闭组中的匹配模式。在 Unicode 模式中,'-'
切换到仅 ASCII 匹配,而(?a:...)
切换到 Unicode 匹配(默认)。在字节模式中,(?u:...)
根据匹配切换到区域设置,(?L:...)
切换到仅 ASCII 匹配(默认)。此覆盖仅对窄内联组有效,并且 群外恢复原有配对模式(?a:...)
3.6 版中的新内容。
3.7 版中的更改:字母 'a', 'L' 和 'u' 也可以组合使用。
不幸的是,Python
re
3.6 之前的版本不支持这些组,也不支持交替打开和关闭内联修饰符。
如果你可以使用 PyPi 正则表达式模块,你可以使用一个
(?i:...)
结构:
import regex
s = "Welcome to PuNe, Maharashtra"
print(regex.findall(r"PuNe|(?i:MaHaRaShTrA)",s))
查看在线 Python 演示。
您可以为第二个单词生成小写/大写正则表达式,并保持大小写有效:
my_regex = "PuNe|"+"".join("[{}{}]".format(x.upper(),x.lower()) for x in "MaHaRaShTrA")
生成:
PuNe|[Mm][Aa][Hh][Aa][Rr][Aa][Ss][Hh][Tt][Rr][Aa]
和
re.search(my_regex,s1)
没有任何选择就可以做你想做的事。