2014-09-27 4 views
-2

Мне было интересно, как я могу извлечь все альфа-числовые неоднородные последовательности из строки в python, и если это можно сделать в стиле без использования регулярных выражений.Python: поиск последовательностей в строке

Под буквенно-цифровых неоднородных последовательностей я имею в виду все последовательности, как аАa1A1 и так далее ... (без знаков препинания, только верхний/нижний регистр букв и цифр.

+0

Почему вы хотите избежать регулярных выражений? Это далекое время для использования регулярных выражений. – Veedrac

ответ

1

Использование re:

import re 
re.findall("[a-zA-Z0-9]+", "hello there1 A2... bl3h") 
#>>> ['hello', 'there1', 'A2', 'bl3h'] 

Не так много.

Если вы хотите что-нибудь, что это цифра Unicode или символ, вы могли бы использовать предстоящий regex модуль:

import regex 
regex.findall("[[:alnum:]]+", "hello_there1 A2... bl3h") 
#>>> ['hello', 'there1', 'A2', 'bl3h'] 

Это должно дать вещи тогда и только тогда thing.isalnum().

+0

Вы также можете использовать '[[: alnum:]] +' – falsetru

+0

Спасибо! Я узнал, что модуль регулярных выражений - это то, что мне нужно для всех целей. – PaulOverflow

+0

@falsetru Nice, спасибо :) – Veedrac

3

Использование str.isalnum:

>>> 'F'.isalnum() 
True 
>>> '7'.isalnum() 
True 
>>> ','.isalnum() 
False 

с list comprehension/generator expression:

>>> [c for c in 'ab,cd"12"EF' if c.isalnum()] 
['a', 'b', 'c', 'd', '1', '2', 'E', 'F'] 
>>> ''.join(c for c in 'ab,cd"12"EF' if c.isalnum()) 
'abcd12EF' 

или filter с несвязанным методом:

>>> filter(str.isalnum, 'ab,cd"12"EF') 
'abcd12EF' 

UPDATE

Если вы не хотите символов, но через последовательность символов, вы можете использовать itertools.groupby:

>>> import itertools 
>>> [''.join(grp) for yes, grp in itertools.groupby('ab,cd"12"EF', key=str.isalnum) if yes] 
['ab', 'cd', '12', 'EF'] 
+0

Обратите внимание, что '" ".isalnum() # >>> True'. Также '' 1 ".isalnum() # >>> True'. – Veedrac

+2

Мое понимание вопроса в том, что он хочет извлечь последовательности, а не только символы. Поэтому результат должен быть скорее «['ab', 'cd', '12', 'EF']'. – georg

+0

@Veedrac, Каков персонаж. Это не очень хорошо отражается на моей машине. Если это символ цифры, это может быть то, что хочет OP. – falsetru

Смежные вопросы