2017-01-25 9 views
2

Учитывая строку, как это :?Как проверить, является ли подстрока имеют ASCII + латинских символов и блокнотом в формате ASCII/латинские буквы подстрок с пробелами

способ добычи, чтобы купить любимый CD и DVD или VCD.

Нужный выход: добыча

способ купить любимый CD и DVD или VCD.

Я попытался просматривал каждый персонаж и проверки того, является ли ASCII символ до и после, и используя следующие условия решают следует ли пэд пространство:

  • Проверьте «ascii- Несс «текущего символа
  • Если предыдущий символ в» ASCII-Несс «не то же самое, что и нынешние, оставляемых-блокнота пространство

Но я делал это как таковой, и это выглядит inefficien т:

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-ность характера, что он работает как на Python 2 и 3?

другого, чем перекручивание через каждый символ? есть еще один способ площадки пространства в начале и в конце латинской подстроки?


Другой бзик с приведенным выше кодом является то, что он не обрабатывает кодовые за [a-zA-Z0-9], например, когда слово «кафе. "->" Caf é. «Желаемый результат будет» кафе. «

Попробуйте это предложение:.

s= u"顺便采买些喜欢的CD和DVD或Café。" 

(По некоторым причинам я не могу поставить желаемый результат, так как SO думает, что это спам, поэтому я просто словесно описать всю подстроку» Кафе «должен быть проложенный, не разделено на 2 подстрок.

обнаружения подстроки должно включать в себя диакритические латинские буквы.

+0

Вы не должны пытаться _encode_ к ascii? Является ли текст строкой unicode? – RemcoGerlich

+0

Обычно это строка юникода, содержащая подстроки ascii. И зная, где это ascii, и начальная и конечная точки смещения необходимы для заполнения пробела. – alvas

+1

Обратите внимание, что акцентированные латинские символы _aren't ASCII_. – RemcoGerlich

ответ

4

В Python3

import re 
s= "顺便采买些喜欢的CD和DVD或Café。" 
re.sub("([A-Za-z0-9À-Öà-ÿ]+)"," \\1 ",s) 

[выход]:

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

регулярное выражение: https://pypi.python.org/pypi/regex

пункт установить регулярное выражение

import regex 
regex.sub("(\p{Latin}+)"," \\1 ",s) 
+1

Спасибо! Stackoverflow не использует тройную '' 'flavored markdown =) – alvas

1

Вы можете использовать split() функциональность модуля регулярных выражений, чтобы разделить ваши строки запроса, где буква в диапазоне a-z или A-Z если найден, а затем объединить все разрезные элементы с пространством, чтобы получить желаемые результаты, как:

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