Сопоставьте числа фиксированной ширины с правосторонним непрерывным пробелом - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь проверить формат внутри большего регулярного выражения и блока текста с фиксированным столбцом.Я хотел бы соответствовать шаблону с фиксированной шириной, но только если он имеет только цифры слева и только пробел (или ни одного) справа.Полученное выражение будет использоваться в Python.

Следующие строки должны соответствовать шаблону из 17 цифр (кроме заголовка):

MATCH
  *****************
A 20081122122332444 B
A 20081122122332    B
A 200811221223      B
A 2008112212        B
A 20081122          B

Но следующее не должно соответствовать

NO MATCH
  *****************
A 20081122112233 1  B
A 2008112211223 1   B
A 200811221     C   B
A 20081122 .        B

Это регулярное выражение достаточно просто сопоставляет действительные данные: (?=\d+\s*)[\d\s]{17}

Это также, похоже, подхватывает искажающие символы: (?=\d+[\s]?[^\d])[\d\s]{17}

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

Казалось бы, есть элегантный способ сделать это в регулярном выражении - захватить непрерывный блок цифр, сопровождаемый непрерывным блоком пробела, в общей сложности 17 символов.

Ответы [ 3 ]

0 голосов
/ 29 сентября 2019

Вы можете достичь цели путем поиска цифр, затем пробела и подсчета количества символов в диапазоне import re text="20081122 . "<br> if re.search('[\d]{1,}[\s]{0,}',s).span()[1]==17: print("yes") else print("no")

0 голосов
/ 29 сентября 2019

Вы говорите, что ищете столбцы шириной 17 символов, и поэтому я буду сопоставлять только до 17 символов, поскольку неясно, что может следовать за этими 17 символами (возможно, это лишние пробелы, что, как представляется, имеет место):

import re

text = """A 20081122122332444 B
A 20081122122332    B
A 200811221223      B
A 2008112212        B
A 20081122          B"""

l = [m.group(0)[0:17] for m in re.finditer(r'\d+\s*', text) if m.span(0)[1] - m.span(0)[0] >= 17]

print(l)

Отпечатки:

['20081122122332444', '20081122122332   ', '200811221223     ', '2008112212       ', '20081122         ']

Если вы используете это как часть большего регулярного выражения, то, возможно, мы должны затем предположить, что за 17-символьным столбцом следует пробели тогда у нас есть:

(?=\d[\d\s]{16})\d+\s*(?=\s)
0 голосов
/ 29 сентября 2019

Часть проблемы с вашим шаблоном в том, что вы используете [\d\s]{17}.Это будет соответствовать строке из 17 символов , состоящей из цифр и пробелов .Хотя вы хотите убедиться, что цифры и пробелы (если есть) являются последовательными.

Для ограничения длины строки вы можете использовать положительный взгляд, чтобы проверить, что вся строка ровно 17 символов.Затем вы можете сопоставить любое количество цифр (длина уже ограничена), необязательно, за которыми следуют пробельные символы.

Вы можете использовать следующий шаблон:

^(?=.{17}$)\d+\s*?$

Демо .

...