去除引号之间的不必要空格。

4

有没有更优雅的方法来去除引号之间的空格(而不是使用像这样的代码:

input = input.replace('" 12 "', '"12"')`)

从像这样的一个句子开始:

 At " 12 " hours " 35 " minutes my friend called me.

问题是数字可能会变化,那么代码就不能正确运行。 :)


2
看一下内置的字符串方法 strip() :) - Charles Dupont
1
正如@BuddyBob所说,您的字符串中没有逗号。您是指引号吗? - Jacob Lee
1
re.sub(r'" +?(.+?) +?"', '"\\1"', s) - Tuan Chau
1
只要你的字符串格式为"something",引号和something之间的空格将被删除。 - Tuan Chau
3个回答

6

只要你的引号用得合理,就可以使用正则表达式:

re.sub(r'"\s*([^"]*?)\s*"', r'"\1"', input)

该模式读作“引号,任意数量的空格,不是引号的内容(被捕获),后跟任意数量的空格和引号。替换内容只是你在引号中捕获的内容。”
请注意,捕获组中的量词是勉强的。这确保您不会捕获尾随的空格。

1
@Mark。感谢你的指出。我本来也想更仔细地编写这个表达式。我对正则表达式很熟悉,但并不是我的专长。 - Mad Physicist

3
你可以尝试使用正则表达式,比如下面这个:

"\s+(.*?)\s+"

这会匹配包含任何非换行符字符的任意长度子字符串,被空格和引号包围。将其传递给re.compile(),你就可以使用返回的Pattern对象调用sub()方法。

>>> import re
>>> string = 'At " 12 " hours " 35 " minutes my friend called me.'
>>> regex = re.compile(r'"\s+(.*?)\s+"')
>>> regex.sub(r'"\1"', string)
'At "12" hours "35" minutes my friend called me.'

\1 调用第一组进行替换,即使用 .*? 匹配的字符串


技术上应该是\s*,不是吗? - Mad Physicist
@MadPhysicist 我猜用 * 或者 + 都可以,但我首先想到的是 + - Jacob Lee

2

这是我快速想出的一个解决方案,适用于您输入的任何数字。

input = 'At " 12 " hours " 35 " minutes my friend called me.'

input = input.split()

for count, word in enumerate(input):
    if input[count] == '"':
        del input[count]
    if input[count].isdigit():
        input[count] = '"' + input[count] + '"'

str1 = ' '.join(input)
print('Output:')
print(str1)

输出:

>>> Output:
>>> At "12" hours "35" minutes my friend called me.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接