2016-08-31 3 views
0

Я пытаюсь найти все, что в списке, который имеет формат, как «###### - ##»Найти все элементы в списке, которые соответствуют определенному формату

Я думал, что правильная идея в моем следующем коде, но он ничего не печатает. Некоторые значения в моем списке имеют такой формат, и я думаю, он должен его распечатать. Не могли бы вы рассказать мне, что случилось?

for line in list_nums: 
    if (line[-1:].isdigit()): 
     if (line[-2:-1].isdigit()): 
      if (line[-6:-5].isdigit()): 
       if ("-" in line[-3:-2]): 
        print(list_nums) 

Значения в моем списке состоят из форматов, как 123456-56 и 123456-98-98, поэтому то, что я сделал выше. Он вытягивается из листа превосходства.

Это мой обновленный код.

import xlrd 
from re import compile, match 

file_location = "R:/emily/emilylistnum.xlsx" 
workbook = xlrd.open_workbook(file_location) 
sheet = workbook.sheet_by_index(0) 
regexp = compile(r'^\d{d}-\d{2}$') 
list_nums = "" 


for row in range(sheet.nrows): 
    cell = sheet.cell_value(row,0) 
    if regexp.match(cell): 
     list_nums += cell + "\n" 
     print(list_nums) 

мой первенствует лист состоит из: 581094-001 581095-001 581096-001 581097-01 5586987-007 SMX53-5567-53BP 552392-01-01 552392 -02 552392-03-01 552392-10-01 552392-10-01 543921-01 556664-55

(в каждой ячейке вниз в одном столбце)

+0

вы можете просто подсчитать количество штрихов в строке, не так ли? Итак, 'if line.count ('-') == 2: print (line)' –

+0

Я думаю, что лучшим решением является использование 're.findall()'. Допустим, вы 'my_string = '. .join (list_nums)'. Все, что вам нужно сделать, это 'found_elements = re.findall ('\ d + - \ d \ d', my_string)'. Обратите внимание, что '\ d + - \ d \ d' может быть неправильным. Проверьте https://docs.python.org/3.1/library/re.html для получения дополнительной информации. – Laszlowaty

ответ

1

Если вам нужно только соответствовать шаблону ######-## (где # это цифра):

>>> from re import compile, match 
>>> regexp = compile(r'^\d{6}-\d{2}$') 
>>> print([line for line in list_nums if regexp.match(line)]) 
['132456-78'] 

Пояснения

Вы compile узор в объект регулярного выражения, чтобы быть более effic ient при сопоставлении. Регулярное выражение ^\d{6}-\d{2}$ где:

^ # start of the line 
\d{6}-\d{2} # 6 digits, one dot then 2 digits 
$ # end of the line 

В регулярном выражении, \d означает цифру (целое число от 0 до 9) и {6} означает 6 раз. Таким образом, \d{3} означает 3 цифры. Вы должны прочитать документацию Python о regexp.


Полный код

Пример основан на ваш комментарий:

file_location = 'file.xlsx' 
workbook = xlrd.open_workbook(file_location) 
sheet = workbook.sheet_by_index(0) 
regexp = compile(r'^\d{6}-\d{2}$') 

list_nums = '' 
for row in range(sheet.nrows): 
    cell = sheet.cell_value(row, 0) 
    if regexp.match(cell): 
     list_nums += cell + "\n" 
+0

Мне нужно найти только те, которые выглядят как 123456-45, а не 123456-94-94 или 123456 или 123456-001 – Emily

+0

ОК, я обновил код. –

+0

Я думаю, что мы с этим справляемся. Однако он не работает для моего кода. импорт ОС, SYS, xlrd file_location = "R:/Пример DELETE ME Копия примера для Emily .xlsx" Учебное пособие = xlrd.open_workbook (file_location) лист = workbook.sheet_by_index (0) list_nums = "" для строки в диапазоне (sheet.nrows): list_nums + = ули (sheet.cell_value (строка, 0)) + "\ п" # печати (list_nums) от повторного импорта компиляции, матч регулярное_выражения = compile (r '\ d {6} - \ d {2} $') print (строка для строки в list_nums, если regexp.match (строка)) – Emily

0

Ваш код, кажется, делать правильные вещи, за исключением того, что вы хотите его печати величина от строка вместо значения list_nums.

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

EDIT: КОД NOW НЕСЕТ list_nums БЫТЬ ОДИН STRING

import re 

rx = re.compile('\d{6}-\d{2}\Z') 
for line in list_nums.split('\n'): 
    if rx.match(line): 
    print line 
+0

hm. матч не работает ..... говорит, что он не используется. я сказал: «Из повторного импорта компиляции, матч», но ничего. – Emily

+0

Хорошо. Запуск кода в списке ** list_nums = ['123456-56', '123456-98-98'] ** дает результат ** '123456-56' ** в моей системе - обратите внимание, что _match_ вызывается на _RegexObject_ ** rx ** не библиотека ** re **. – Jonas

+0

- это то, что ваш набор/список? my - это просто строка, она успешно завершит код, но ничего не выводит – Emily

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