我正在尝试使用否定模式在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)
答案 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'