Вставьте пробел между не буквенно-цифровым и буквенно-цифровым символом, кроме определенного символа (Python)

Есть ли шанс исключить из рассмотрения некоторые юникоды (не буквенно-цифровые)? Я размечаю арабские слова, которые иногда содержат диакритические знаки, которые считаются небуквенно-цифровыми символами, но я не хочу их удалять, и мне нужно иметь пробел между небуквенно-цифровыми символами (кроме диакритических знаков) и буквенно-цифровыми символами. и это с помощью регулярного выражения? Юникод, который я хочу исключить, который представляет диакритические знаки, выглядит следующим образом: u'\ u064b', u'\ u064c', u'\ u064d', u'\ u064e', u'\ u064f', u'\ u0650', u'ّ', u'ْ'

это возможно ?

Спасибо заранее


person user2490790    schedule 29.06.2013    source источник
comment
Не могли бы вы отредактировать свой вопрос, чтобы включить пример?   -  person slackwing    schedule 29.06.2013


Ответы (1)


Просто создайте собственный буквенно-цифровой шаблон для своей цели:

accents = [u'\u064b', u'\u064c', u'\u064d', u'\u064e', u'\u064f', u'\u0650', u'\u0651', u'\u0652']
alnum = r'([\w%s]+)' % re.escape(''.join(accents))
pattern = re.compile(alnum, re.UNICODE)

Чтобы найти все токены:

>>> test_str = "...foo" + ''.join(accents) + "...bar"
>>> test_str
'...fooًٌٍَُِّْ...bar'
>>> pattern.findall(test_str)
['fooًٌٍَُِّْ', 'bar']
>>> len(_)
2

Теперь, чтобы поставить пробел между токенами и остальными:

>>> ' '.join(filter(None, pattern.split(test_str)))
'... fooًٌٍَُِّْ ... bar'
>>> len(_.split())
4
person michaelmeyer    schedule 29.06.2013
comment
Ух ты! большое спасибо, это именно то, что мне было нужно .. очень признателен, работает отлично - person user2490790; 29.06.2013