2013-04-11 1 views
1

У меня есть файл с данными в следующем формате:вопрос написания регулярных выражений для 6 полукокса кода

1 AA/BB     0C89JG 
    2 ABANO/ANA VICTORIA  F12LFJ 
    3 ABBOUDLASTNAME/ABBOUDF DWPTHC 
    4 ABDALLAH/SIJAM   H0ZDM9 
    5 ABDEL MESSIH/DINA  T0SF8N 
    6 ABHISHEK/PRAMANIK  7SLKXV 
    7 ABHYANKAR/DHANANJAY 7SM0BV 
    8 ABOUSALAMA/FEMKE  LTTRQC 
    9 ABRAMOVA/NATALIA  77LCPZ 
    10 ABRANTES/JOAO   KXZC7Q 
    11 ABRATH/LUC    D5J99J 
    12 ABREO/HECTOR   CXDH4G 
    13 ABREU/ANDREA   242GRC 
    14 ABREU/MARCELO   2436R7 
    15 ABREU/VANDA   3HDNQQ 
    16 ABTS/NATHALIE   DSK9TN 
    17 ABTS/NATHALIE   FZ0LN4 

И я пытаюсь извлечь последние 6 символов, например, FZ0LN4 от линии 17. Регулярное выражение, что я придумал это:

([0-9]{1,5})([A-Z /]) ([0-9A-Z]{6}) 

Но он не работает в данный момент. Кто-нибудь может указать, в чем проблема?

ответ

2

Есть несколько вопросов:

  • Вы не соответствующие некоторые из непечатаемых.
  • [A-Z /] не имеет оператора повторения.

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

In [8]: re.match(r'\s*(\d+)\s*([A-Z /]+?)\s*(\w+)$', ' 15 ABREU/VANDA   3HDNQQ').groups() 
Out[8]: ('15', 'ABREU/VANDA', '3HDNQQ') 

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

In [15]: s = ' 15 ABREU/VANDA   3HDNQQ' 

In [16]: s[-6:] 
Out[16]: '3HDNQQ' 
+1

гораздо лучше, чем у меня :) но он потерпит неудачу на 2-й записи :( – RAB

+0

@RaheelAliBaloch: Хорошая точка, я упустил место. Исправлено. – NPE

0

использовать $ характер для линии и линии и \S для небелых символов пробела

import re 
>>> s = s = ''' 1 AA/BB     0C89JG 
    2 ABANO/ANA VICTORIA  F12LFJ 
    3 ABBOUDLASTNAME/ABBOUDF DWPTHC 
    4 ABDALLAH/SIJAM   H0ZDM9 
    5 ABDEL MESSIH/DINA  T0SF8N 
    6 ABHISHEK/PRAMANIK  7SLKXV 
    7 ABHYANKAR/DHANANJAY 7SM0BV 
    8 ABOUSALAMA/FEMKE  LTTRQC 
    9 ABRAMOVA/NATALIA  77LCPZ 
    10 ABRANTES/JOAO   KXZC7Q 
    11 ABRATH/LUC    D5J99J 
    12 ABREO/HECTOR   CXDH4G 
    13 ABREU/ANDREA   242GRC 
    14 ABREU/MARCELO   2436R7 
    15 ABREU/VANDA   3HDNQQ 
    16 ABTS/NATHALIE   DSK9TN 
    17 ABTS/NATHALIE   FZ0LN4''' 

>>> re.findall('\\S{6}$', s, re.MULTILINE) 
['0C89JG', 'F12LFJ', 'DWPTHC', 'H0ZDM9', 'T0SF8N', '7SLKXV', '7SM0BV', 'LTTRQC', '77LCPZ', 'KXZC7Q', 'D5J99J', 'CXDH4G', '242GRC', '2436R7', '3HDNQQ', 'DSK9TN', 'FZ0LN4'] 
2

Если вам просто нужна строка в конце строки вы можете использовать более простое регулярное выражение, например: \b\w{6}\b$

1

Вы ищете только для последней строки (17)? Если да, то re.search всей строки:

import re 
myString=""" 
    1 AA/BB     0C89JG 
    2 ABANO/ANA VICTORIA  F12LFJ 
    3 ABBOUDLASTNAME/ABBOUDF DWPTHC 
    4 ABDALLAH/SIJAM   H0ZDM9 
    5 ABDEL MESSIH/DINA  T0SF8N 
    6 ABHISHEK/PRAMANIK  7SLKXV 
    7 ABHYANKAR/DHANANJAY 7SM0BV 
    8 ABOUSALAMA/FEMKE  LTTRQC 
    9 ABRAMOVA/NATALIA  77LCPZ 
    10 ABRANTES/JOAO   KXZC7Q 
    11 ABRATH/LUC    D5J99J 
    12 ABREO/HECTOR   CXDH4G 
    13 ABREU/ANDREA   242GRC 
    14 ABREU/MARCELO   2436R7 
    15 ABREU/VANDA   3HDNQQ 
    16 ABTS/NATHALIE   DSK9TN 
    17 ABTS/NATHALIE   FZ0LN4 
""" 

m = re.search("(\S{6})$", myString) 
if m: 
    print m.group(1) 

Если вам необходимо найти конкретную строку, вы должны выполнять итерацию по линиям по отдельности:

for line in myString.split("\n"): 
    m = re.search("^\s*17\s*.*(\S{6})$", line) 
    if m: 
     print m.group(1) 
+0

+1 для тех же, что и у меня – User

1

Это легко сделать без регулярных выражений:

st='''\ 
    1 AA/BB     0C89JG 
    2 ABANO/ANA VICTORIA  F12LFJ 
    3 ABBOUDLASTNAME/ABBOUDF DWPTHC 
    4 ABDALLAH/SIJAM   H0ZDM9 
    5 ABDEL MESSIH/DINA  T0SF8N 
    6 ABHISHEK/PRAMANIK  7SLKXV 
    7 ABHYANKAR/DHANANJAY 7SM0BV 
    8 ABOUSALAMA/FEMKE  LTTRQC 
    9 ABRAMOVA/NATALIA  77LCPZ 
    10 ABRANTES/JOAO   KXZC7Q 
    11 ABRATH/LUC    D5J99J 
    12 ABREO/HECTOR   CXDH4G 
    13 ABREU/ANDREA   242GRC 
    14 ABREU/MARCELO   2436R7 
    15 ABREU/VANDA   3HDNQQ 
    16 ABTS/NATHALIE   DSK9TN 
    17 ABTS/NATHALIE   FZ0LN4''' 

for line in st.splitlines(): 
    print line.split()[-1] 

Печать:

0C89JG 
F12LFJ 
DWPTHC 
H0ZDM9 
T0SF8N 
7SLKXV 
7SM0BV 
LTTRQC 
77LCPZ 
KXZC7Q 
D5J99J 
CXDH4G 
242GRC 
2436R7 
3HDNQQ 
DSK9TN 
FZ0LN4 

Или, если вы просто хотите 'п-й' один, что-то вроде этого:

>>> li=[line.split()[-1] for line in st.splitlines()] 
>>> li[-1] 
'FZ0LN4' 
>>> li[-2] 
'DSK9TN' # etc etc 

Или, если вы действительно хотите регулярное выражение:

>>> re.findall(r'\s(\S{6})$',st,re.MULTILINE) 
['0C89JG', 'F12LFJ', 'DWPTHC', 'H0ZDM9', 'T0SF8N', '7SLKXV', '7SM0BV', 'LTTRQC', '77LCPZ', 'KXZC7Q', 'D5J99J', 'CXDH4G', '242GRC', '2436R7', '3HDNQQ', 'DSK9TN', 'FZ0LN4'] 
>>> re.findall(r'\s(\S{6})$',st,re.MULTILINE)[-1] 
'FZ0LN4' 
Смежные вопросы