2015-03-16 3 views
1

У меня есть большой .txt файл, состоящий из: word1, word2, id, number следующим образом:Проблемы с кодировкой regex python?

s = ''' 
Vaya ir VMM03S0 0.427083 
mañanita mañana RG 0.796611 
, , Fc 1 
buscando buscar VMG0000 1 
una uno DI0FS0 0.951575 
lavadora lavadora NCFS000 0.414738 
con con SPS00 1 
la el DA0FS0 0.972269 
que que PR0CN000 0.562517 
sorprender sorprender VMN0000 1 
a a SPS00 0.996023 
una uno DI0FS0 0.951575 
persona persona NCFS000 0.98773 
muy muy RG 1 
especiales especial AQ0CS0 1 
para para SPS00 0.999103 
nosotros nosotros PP1MP000 1 
, , Fc 1 
y y CC 0.999962 
la lo PP3FSA00 0.0277039 
encontramos encontrar VMIP1P0 0.65 
. . Fp 1 

Pero pero CC 0.999764 
vamos ir VMIP1P0 0.655914 
a a SPS00 0.996023 
lo el DA0NS0 0.457533 
que que PR0CN000 0.562517 
interesa interesar VMIP3S0 0.994868 
LO_QUE_INTERESA_La lo_que_interesa_la NP00000 1 
lavadora lavador AQ0FS0 0.585262 
tiene tener VMIP3S0 1 
una uno DI0FS0 0.951575 
clasificación clasificación NCFS000 1 
A+ a+ NP00000 1 
, , Fc 1 
de de SPS00 0.999984 
las el DA0FP0 0.970954 
que que PR0CN000 0.562517 
ahorran ahorrar VMIP3P0 1 
energía energía NCFS000 1 
, , Fc 1 
si si CS 0.99954 
no no RN 0.998134 
me me PP1CS000 0.89124 
equivoco equivocar VMIP1S0 1 
. . Fp 1 

Lava lavar VMIP3S0 0.397388 
hasta hasta SPS00 0.957698 
7 7 Z 1 
kg kilogramo NCMN000 1 
, , Fc 1 
no no RN 0.998134 
está estar VAIP3S0 0.999201 
nada nada RG 0.135196 
mal mal RG 0.497537 
, , Fc 1 
se se P00CN000 0.465639 
le le PP3CSD00 1 
veía ver VMII3S0 0.62272 
un uno DI0MS0 0.987295 
gran gran AQ0CS0 1 
tambor tambor NCMS000 1 
((Fpa 1 
de de SPS00 0.999984 
acero acero NCMS000 0.973481 
inoxidable inoxidable AQ0CS0 1 
)) Fpt 1 
y y CC 0.999962 
un uno DI0MS0 0.987295 
consumo consumo NCMS000 0.948927 
máximo máximo AQ0MS0 0.986111 
de de SPS00 0.999984 
49 49 Z 1 
litros litro NCMP000 1 
Mandos mandos NP00000 1 
intuitivos intuitivo AQ0MP0 1 
, , Fc 1 
todo todo PI0MS000 0.43165 
muy muy RG 1 
bien bien RG 0.902728 
explicado explicar VMP00SM 1 
, , Fc 1 
nada nada PI0CS000 0.850279 
que que PR0CN000 0.562517 
ver ver VMN0000 0.997382 
con con SPS00 1 
hola RG 0.90937838 
como VMP00SM 1 
estas AQ089FG 0.90839 
la el DA0FS0 0.972269 
lavadora lavadora NCFS000 0.414738 
de de SPS00 0.999984 
casa casa NCFS000 0.979058 
de de SPS00 0.999984 
mis mi DP1CPS 0.995868 
padres padre NCMP000 1 
Además además NP00000 1 
también también RG 1 
seca seco AQ0FS0 0.45723 
preciadas preciar VMP00PF 1 
. . Fp 1''' 

Например, для s «файл» Я хотел бы, чтобы извлечь ids, которые начинаются с AQ и RG с последующим их word2, но они должны ocurre один за другим для приведенного выше примера эти слова держать друг за другом порядке:

muy muy RG 1 
especial especial AQ0CS0 1 

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

hola RG 0.90937838 
como VMP00SM 1 
estas AQ089FG 0.90839 

Я хотел бы создать регулярное выражение, которое извлечь в кортеже перечислите только word2, а затем его id вот так: [('word2','id')] для всего TXT-файла и для всех слов, которые хранятся по-другому. Для приведенного выше примера это единственный правильный выход:

muy muy RG 1 
especiales especial AQ0CS0 1 

и

también también RG 1 
seca seco AQ0FS0 0.45723 

Затем вернуть их в кортеж с полным id, так как они сохраняют одну за другой заказ:

[('muy', 'RG', 'especial', 'AQ0CS0'), ('también', 'RG', 'seco', 'AQ0FS0')] 

Я попробовал следующее:

в:

t = re.findall(r'(\w+)\s*(RG)[^\n]*\n[^\n]*?(\w+)\s*(AQ\w*)', s) 
print t 

Но мой выход неправильно, так как падают акцент и некоторые символы:

из:

[('muy', 'RG', 'especial', 'AQ0CS0'), ('n', 'RG', 'seco', 'AQ0FS0')] 

вместо, который является правильным:

[('muy', 'RG', 'especial', 'AQ0CS0'), ('también', 'RG', 'seco', 'AQ0FS0')] 

Не мог бы кто-нибудь помочь мне под что случилось с моим предыдущим примером и как его исправить, чтобы поймать word2 и id, которые сохраняют одно за другим. Спасибо заранее, ребята.

+1

Is '' 'mañanita mañana RG 0.796611''' действительно? – wwii

+0

Спасибо за помощь @wwii. Недействительно, так как отсутствует 'AQ' после' mañanita mañana RG 0.796611' – newWithPython

+0

Единственный допустимый вывод для этого: '[('muy', 'RG', 'specialpecial', 'AQ0CS0'), ('también' , 'RG', 'seco', 'AQ0FS0')] ' – newWithPython

ответ

1

В Python 2, с 8-битовых строк (str) , \w всего совпадений [0-9a-zA-Z_].Однако, если вы используете unicode и скомпилируете свой шаблон с флагом re.UNICODE, то \w соответствует символам слов на основе базы данных юникода. Python documentation 7.2.1 regular expression syntax:

Когда LOCALE и UNICODE флаги не указано, соответствует любому алфавитно-цифровые символы и подчеркивание; это эквивалентно набору [a-zA-Z0-9_]. С LOCALE он будет соответствовать набору [0-9_] плюс любые символы, определенные как буквенно-цифровые для текущего языкового стандарта. Если установлено UNICODE, это будет соответствовать символам [0-9_]плюс все, что классифицируется как алфавитно-цифровое в базе данных свойств символов Юникода.


Таким образом, вы можете сделать

u = s.decode('UTF-8') # or whatever encoding is in your text file 
t = re.findall(r'(\w+)\s*(RG)[^\n]*\n[^\n]*?(\w+)\s*(AQ\w*)', re.UNICODE) 

В Python 3 большая часть str/unicode путанице ушел; когда вы открываете файл в текстовом режиме и читаете его содержимое, вы получите объект Python 3 str, который обрабатывает все как символы Unicode.

+0

Спасибо за помощь! – newWithPython

1

похоже, что \ w + не распознает специальный символ.

так что если ваш TXT строго разделены пробелом, вы можете заменить \ ш с \ S

регулярное выражение будет

t = re.findall(r'(\S+)\s*(RG)[^\n]*\n[^\n]*?(\S+)\s*(AQ\S*)', s) 
Смежные вопросы