带有否定模式的Python正则表达式

时间:2016-03-07 00:16:30

标签: python regex

我正在尝试使用否定模式在Python中编写正则表达式语句。我希望匹配一个不以U开头,后跟W的模式,并且可选地以1结尾。以下是一些例子。

TUW1TH > # regex does not get applied
JUWRG > # regex does not get applied
BUIUW1 > # regex does not get applied
ATWKO > ATW KO # regex applies and space is added after the W
EWRG > E WRG # regex applies and space is added after the W
AGDTWSD > AGDTW SD # regex applies and space is added after the W

以下是我尝试使用的正则表达式语句:

 re.sub(ur"[^U]W[^?1]", ur"W ", word)

3 个答案:

答案 0 :(得分:2)

我认为你要求匹配一个' W'可选地后跟一个' 1,但只有在' W'之前没有' U'。如果是这种情况,那么背后会出现负面看法"是答案:

import re

testcases = ['TUW1TH', 'JUWRG', 'BUIUW1', 'ATWKO', 'EWRG', 'AGDTWSD', 'W1EF', 'EW1RG']

# The `(W1?)` part matches a 'W' with an optional '1'. The `(?<!U)` part 
#     matches the current position only if it wasn't a preceded by a 'U'
pattern = re.compile(r'(?<!U)(W1?)')

for s in testcases:
    print(pattern.sub(r'\1 ', s))

输出:

TUW1TH
JUWRG
BUIUW1
ATW KO
EW RG
AGDTW SD
W1 EF
EW1 RG

注意:[^U]在一行的开头不起作用。

答案 1 :(得分:0)

看起来你想要[^U]W1?

您使用了包含&#34;而不是?&#34;的字符类,而不是令牌&#34;可选1&#34;。

答案 2 :(得分:0)

尝试使用正则表达式模式([^U])W1?'并将其与re.sub()一起使用,并使用引用捕获的组的替换,如下所示:

import re

pattern = re.compile(r'([^U]W)1?')
for s in 'TUW1TH', 'JUWRG', 'BUIUW1', 'ATWKO', 'EWRG', 'AGDTWSD':
    print(pattern.sub(r'\1 ', s))

<强>输出

TUW1TH
JUWRG
BUIUW1
ATW KO
EW RG
AGDTW SD

请注意'EWRG'的输出与您的示例不同......我认为这是您问题中的拼写错误?

您的问题不清楚如何处理1之后的可选W,并且没有示例可供展示。 1被删除或保留吗?上述代码将丢失1

>>> print(pattern.sub(r'\1 ', 'TW1TH'))
TW TH

如果您希望输出包含1,则可以将正则表达式模式更改为r'([^U]W)(1?)',为可选的1添加第二个捕获组,并将替换更改为环R \1 \2

>>> re.sub(r'([^U]W)(1?)', r'\1 \2', 'TW1TH')
'TW 1TH'