如何检查子字符串是否为ascii +拉丁字符,并用空格填充ascii / latin字符子字符串?

时间:2017-01-25 09:01:25

标签: python string python-3.x utf-8 ascii

给出这样的字符串:

  

顺便采买些喜欢的CD和DVD或VCD。

所需的输出是:

  

顺便采买些喜欢的CD和DVD或vcd。

我已经尝试查看每个字符并检查前后字符是否为ascii,并使用以下条件决定是否应填充空格:

  • 检查当前字符的“ascii-ness”
  • 如果前一个字符的“ascii-ness”与当前字符不相同,则左键填充空格

但我一直这样做,看起来效率低下:

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个子串。

子串的检测需要包含带重音的拉丁字符。

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-zA-Z范围内的字母(如果找到),然后将所有拆分元素与空格连接到得到所需的结果:

import re
s = u"顺便采买些喜欢的CD和DVD或vcd"
print " ".join(re.split(r"([a-zA-Z]+)", s))