我问的是Python Regular expression must strip whitespace except between quotes
的反面我想使用re.sub从嵌入在较大字符串中的单引号字符串中删除前导和尾随空格。如果我有,比方说,
textin = " foo ' bar nox ': glop ,' frox ' "
我想制作
desired = " foo 'bar nox': glop ,'frox' "
删除前导空格相对简单。
>>> lstripped = re.sub(r"'\s*([^']*')", r"'\1", textin)
>>> lstripped
" foo 'bar nox ': glop ,'frox ' "
问题是删除尾随空格。我试过,例如,
>>> rstripped = re.sub(r"('[^']*)(\s*')", r"\1'", lstripped)
>>> rstripped
" foo 'bar nox ': glop ,'frox ' "
但由于[^']*
与尾随空格匹配而失败。
我考虑过使用回溯模式,但Re doc说它们只能包含固定长度的模式。
我确信这是以前解决的问题,但我很难过。
谢谢!
编辑:解决方案需要处理包含单个非空白字符和空字符串的字符串,即' p ' --> 'p'
和' ' --> ''
。
答案 0 :(得分:2)
a_letters
- 贪婪,即它还包含空格和/或标签,所以让我们使用非贪婪的:[^\']*
[^\']*?
较少转义的版本:
In [66]: re.sub(r'\'\s*([^\']*?)\s*\'','\'\\1\'', textin)
Out[66]: " foo 'bar nox': glop ,'frox' "
答案 1 :(得分:2)
捕捉空白的方法是定义前一个
*非贪婪,而不是r"('[^']*)(\s*')"
使用r"('[^']*?)(\s*')"
。
您还可以使用单个正则表达式捕获双方:
stripped = re.sub("'\s*([^']*?)\s*'", r"'\1'", textin)
答案 2 :(得分:0)
这似乎有效:
' # an apostrophe
(\s*) # 0 or more white-space characters (leading white-space)
(.*?) # 0 or more any character, lazily matched (keep)
(\s*) # 0 or more white-space characters (trailing white-space)
' # an apostrophe
<Hub>
<HubSection>
<DataTemplate>
</DataTemplate>
</HubSection>
</Hub>