2016-08-15 4 views
2

У меня есть следующая строка:Python Regexp для извлечения тегов и слова

str1 = "I/TAG1 like/TAG2 red/TAG3 apples/TAG3 ./TAG4" 

И у меня есть два списка в Python

tokens = [] 
tags = [] 

Мой желаемый результат будет:

tokens = ['I', 'like', 'red', 'apples', '.'] 
tags = ['TAG1', 'TAG2', 'TAG3', 'TAG3', 'TAG4'] 

Я пытаюсь использовать regexp, как этот:

r"\w*\/" 

Но это извлекает слова косой чертой, то есть I /. Как я могу получить желаемый результат, по крайней мере для токенов (получить все до /)?

ответ

4

Вы можете использовать:

>>> re.findall(r'([\w.]+)/([\w.]+)', str1) 

[('I', 'TAG1'), ('like', 'TAG2'), ('red', 'TAG3'), ('apples', 'TAG3'), ('.', 'TAG4')] 

Код:

>>> tags=[] 
>>> vals=[] 
>>> for m in re.findall(r'([\w.]+)/([\w.]+)', str1): 
...  tags.append(m[0]) 
...  vals.append(m[1]) 
... 

>>> print tags 
['I', 'like', 'red', 'apples', '.'] 

>>> print vals 
['TAG1', 'TAG2', 'TAG3', 'TAG3', 'TAG4'] 
+0

Один последний вопрос, что я должен делать, если я хочу также извлечь слова, подобные этим: mt./gal/hr/TAG5, 1/2/TAG5? (Тег всегда после последнего /) – dpalma

+1

ok используйте это регулярное выражение, затем 'r '(\ S +)/([\ w.] +)'' Вместо 'r '([\ w.] +)/([ \ ш.] +) '' – anubhava

2

Вы можете использовать комбинацию str.split() пространством и слэш. Затем вызова zip() конвейерный вывод на два отдельных списка:

>>> tokens, tags = zip(*[item.split("/") for item in str1.split()]) 
>>> tokens 
('I', 'like', 'red', 'apples', '.') 
>>> tags 
('TAG1', 'TAG2', 'TAG3', 'TAG3', 'TAG4') 
Смежные вопросы