在 python 正则表达式中限制 1 个单词区分大小写,其他单词不区分大小写 | (管)

问题描述 投票:0回答:2

我在 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 regex
2个回答
11
投票

在 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'
的字母。)字母设置或删除相应的标志:
re.A
(仅ASCII匹配),
re.I
(忽略case),
re.L
(locale dependent),
re.M
(multi-line),
re.S
(dot matches all),
re.U
(Unicode matching), and
re.X
(详细),用于表达式的一部分。 (标志在模块内容中描述。)

字母

'a'
'L'
'u'
在用作内联标志时是互斥的,因此它们不能组合或跟在
'-'
之后。相反,当其中一个出现在内联组中时,它会覆盖封闭组中的匹配模式。在 Unicode 模式中,
(?a:...)
切换到仅 ASCII 匹配,而
(?u:...)
切换到 Unicode 匹配(默认)。在字节模式中,
(?L:...)
根据匹配切换到区域设置,
(?a:...)
切换到仅 ASCII 匹配(默认)。此覆盖仅对窄内联组有效,并且 群外恢复原有配对模式

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 演示


2
投票

您可以为第二个单词生成小写/大写正则表达式,并保持大小写有效:

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)
没有任何选择就可以做你想做的事。

© www.soinside.com 2019 - 2024. All rights reserved.