给出这样的字符串:
顺便采买些喜欢的CD和DVD或VCD。
所需的输出是:
顺便采买些喜欢的CD和DVD或vcd。
我已经尝试查看每个字符并检查前后字符是否为ascii,并使用以下条件决定是否应填充空格:
但我一直这样做,看起来效率低下:
def addSpace(text):
currIsAscii = None; prevIsAscii = None; newsentence = ""
for i in text:
try:
i.decode('ascii')
currIsAscii = True
except:
currIsAscii = False
if prevIsAscii != currIsAscii:
newsentence+=" "
newsentence+=i
else:
newsentence+=i
prevIsAscii = currIsAscii
while " " in newsentence:
newsentence = newsentence.replace(" ", " ")
return newsentence.strip()
此代码适用于Python2,但i.decode('ascii')
部分不是Python2和Python3兼容的解决方案,我见过How to check if a string in Python is in ASCII?但是Python 2和3都没有解决方案。
有没有办法检查字符的ascii-ness,使其适用于Python 2和3?
除了遍历每个角色?是否有另一种方法来填充ascii子串的开始和结束空间?
上面代码的另一个怪癖是它不处理[a-zA-Z0-9]
以外的代码点,例如当“Café。”这个词时 - > “Café。”,所需的输出将是“Café。”
试试这句话:
s= u"顺便采买些喜欢的CD和DVD或Café。"
(出于某种原因,我无法输出所需的输出,因为SO认为它是垃圾邮件,所以我只是口头描述。整个子串“Café”应该填充,而不是分成2个子串。
子串的检测需要包含带重音的拉丁字符。
答案 0 :(得分:4)
在Python3中
import re
s= "顺便采买些喜欢的CD和DVD或Café。"
re.sub("([A-Za-z0-9À-Öà-ÿ]+)"," \\1 ",s)
[OUT]:
顺便采买些喜欢的 CD 和 DVD 或 Café 。
正则表达式:https://pypi.python.org/pypi/regex
pip install regex
import regex
regex.sub("(\p{Latin}+)"," \\1 ",s)
答案 1 :(得分:1)
您可以使用正则表达式模块中的split()
功能将查询字符串拆分为a-z
或A-Z
范围内的字母(如果找到),然后将所有拆分元素与空格连接到得到所需的结果:
import re
s = u"顺便采买些喜欢的CD和DVD或vcd"
print " ".join(re.split(r"([a-zA-Z]+)", s))