我有几个字符串,我想在空格和字符"
,'
,(
,)
,;
,{ {1}}和|
,除非使用&
进行转义。
一些例子如下:
\
为此,我写了正则表达式:
"hello-world" -> [r"hello-world"]
"hello;world " -> [r"hello", r"world"]
"he(llo)(w|o rld)" -> ["he", "llo", "w, "o", "rld"]
r"hello\;world" -> [r"hello\;world"]
r"hello\-world" -> [r"hello\-world"]
它适用于所有其他情况,除了一个:
r'''(?:[^\s"'();|&]+|\\.)+'''
如何修改正则表达式以获得预期结果?
我不想使用>>> re.findall(r'''(?:[^\s"'();|&]+|\\.)+''', r'hello\;world')
['hello\\', 'world']
;上面的正则表达式是一个更大的正则表达式的一部分,用于使用re.split()
对编程语言进行标记。
答案 0 :(得分:2)
您的[^\s"'();|&]+
模式部分会抓取\
,然后\\.
无法正确匹配转义的字符。
您可以使用
(?:\\.|[^\s"'();|&\\])+
请参阅regex demo
此处,模式匹配任何转义字符的一次或多次重复(如果使用re.DOTALL
或re.S
,甚至包括换行符),或除空格之外的任何字符{{1} },"
,'
,(
,)
,;
,|
或&
。
\
输出:
import re
strs = ['hello-world', r'hello;world ', r'he(llo)(w|o rld)', r'hello\;world',r'hello\-world ']
for s in strs:
res = re.findall(r'''(?:\\.|[^\s"'();|&\\])+''', s)
for val in res:
print(val)
print("-------------")