У меня возникли проблемы с определением правильного способа написания кода для поиска всех ячеек, соответствующих моему регулярному выражению. Это то, что у меня есть до сих пор. Я знаю, что не могу просто приравнять значение ячейки к моему регулярному выражению, но я не знаю, как это сделать.
import openpyxl
import re
date = re.compile(r'\d{1,2}[/-]\d{1,2}[/-]18-\d{1,2}[/-]\d{1,2}[/-](18|19)')
for sheet in wb:
for row in sheet.iter_rows():
for cell in row:
if cell.value == date:
print (cell.value)
Примеры:
IN: mo = date.search('Support Term 3/7/18-3/6/18')
IN: mo.group()
OUT: '3/7/18-3/6/18'
(я проверил свое регулярное выражение, и оно работает так, как я хочу, но мой цикл for явно нуждается в некоторой доработке)
да, извините, я отредактировал свой пост, надеюсь, это поможет
Да, ваше регулярное выражение кажется мне подходящим (хотя оно также будет соответствовать недопустимым датам, но это в стороне...) Я действительно не очень хорошо знаю Python, но не следует ли if cell.value == date
заменить чем-то вроде if date.match(cell.value)
или if date.search(cell.value)
?
да, это данные, которые мне нужны, независимо от того, плохи они или нет, и я попробовал метод date.search(), но он возвращает ошибку, потому что ему нужна строка или байты, подобные объекту
Смотрите мой комментарий к ответу ниже.
Я думаю, что вы хотите использовать метод search
скомпилированного объекта:
import openpyxl
import re
date = re.compile(r'\d{1,2}[/-]\d{1,2}[/-]18-\d{1,2}[/-]\d{1,2}[/-](18|19)')
for sheet in wb:
for row in sheet.iter_rows():
for cell in row:
if date.search(str(cell.value)):
print(cell.value)
TypeError Traceback (последний последний вызов) <ipython-input-10-7329745cced7> в <module> 2 для строки в sheet.iter_rows(): 3 для ячейки в строке: ----> 4, если date.search(cell. значение): 5 print (cell.value) TypeError: ожидаемая строка или байтовый объект
да, я тоже это пробовал, но, похоже, в методе date.search() нужна строка или «байтовый объект»
Опять же, я не знаю python, но похоже, что cell.value
не является строкой (что на самом деле имеет смысл, потому что Cell.Value является вариантом в Excel VBA и обычно является объектом при чтении другими языками программирования), поэтому его, вероятно, необходимо преобразовать . См. это.
Да! это сработало спасибо. Я не понимал, что это не строковый тип с самого начала. Спасибо вам обоим за помощь. Я думал, что это что-то простое, но не думал, что это будет так просто.
Можете ли вы привести несколько примеров того, что вы пытаетесь сопоставить? Кажется, вы хотите сопоставить некоторые значения даты, но если ваш шаблон регулярного выражения не работает, то его чтение, вероятно, не даст нам точной демонстрации того, чего вы пытаетесь достичь.