Как создать шаблон регулярного выражения, чтобы вытащить символ из списка строк с различной структурой? - PullRequest
1 голос
/ 25 мая 2019

Я использую регулярное выражение, чтобы извлечь букву "u" из адресной строки, но только когда она используется в качестве сокращения (u, u., U, U. и т. Д.). Однако проблема, с которой я работаю, состоит в том, что список строк, которые у меня есть, запутан и полон ошибок. Я уже пытался извлечь то, что мне нужно, из множества ошибок, которые я видел в данных. Я знаю, что, должно быть, мне не хватает чего-то маленького, но любая помощь приветствуется.

Я пробовал эти выражения регулярных выражений:

  • (\ s (u | U)?.?,?.? \ S) <- кажется немного странным </li>
  • [^ \ ш +] [мкЕд]
  • [^ \ ш +] [мкЕд] [^ TCA]

У меня также есть другая идея, чтобы обойти эту проблему, которая потребует разделения адресов (разделенных на улицу, номер и т. Д.), А затем исправить часть улицы и склеить ее обратно. Мне повезло, что я вытащил только номерную часть:

  • (\ d + - \ d + | \ d + / * \ w * | (-))

Тем не менее, я хотел бы увидеть, где я запутался в выражении регулярного выражения, которое должно выбирать «u». Regex101.com был моим лучшим другом с этим, и я бы не стал так далеко без него.

test_strings = [
    "Holics u 5/a",
    "Holics U 5/a",
    "Holics u5/a",
    "Huolics u 5/a",
    "Holics u. 5/a",
    "Holuics u5",
    "Holics and other stuff u more stuff after 5",
    "Houlics utca 5"
]

# two regex patterns I have considered 

print("First regex pattern ------------------------------------")
pattern = r"[^\w+][uU]"
replacement_text = " utca "

for item in test_strings:
    print(re.sub(pattern,replacement_text,item))

print("\nSecond regex pattern ------------------------------------")
pattern = r"[^\w+][uU][^tca]"
replacement_text = " utca "

for item in test_strings:
    print(re.sub(pattern,replacement_text,item))

Результаты из вышеуказанного кода:

Первый шаблон регулярного выражения:

Holics utca  5/a
Holics utca  5/a
Holics utca 5/a
Huolics utca  5/a
Holics utca . 5/a
Holuics utca 5
Holics and other stuff utca  more stuff after 5
Houlics utca tca 5 # <-------------------------------- issue

Второй шаблон регулярного выражения:

Holics utca 5/a
Holics utca 5/a
Holics utca /a # <----------------------------------- issue
Huolics utca 5/a
Holics utca  5/a
Holuics utca  <-------------------------------------- issue
Holics and other stuff utca more stuff after 5
Houlics utca 5

Все работает, за исключением последней строки («Houlics utca tca 5») в первом шаблоне регулярных выражений, и когда я пытаюсь создать выражение, учитывающее также строки, содержащие «utca», я теряю числа в строках как "Holics U5 / A."

По большей части я ожидаю, что результат будет:

  • Holics u. 5 / a -----> Holics utca 5 / a

В качестве последнего замечания, у меня есть функции, которые удаляют точки и пробелы.

1 Ответ

1 голос
/ 25 мая 2019

Вы можете использовать

re.sub(r'\b[uU](?=\b|\d)\.?\s*', 'utca ', s)

Подробности

  • \b - граница слова
  • [uU] - uили U
  • (?=\b|\d) - справа от текущего местоположения должна быть граница слова или цифра
  • \.? - необязательная точка
  • \s* - 0+ пробелов.

Кроме того, вы можете использовать

re.sub(r'\b[uU](?=\b|(?![^\W\d_]))\.?\s*', 'utca ', s)

См. regex demo и еще одну демонстрацию regex .

Здесь вместо требования к цифре (?![^\W\d_]) завершается ошибкой, если следующий символ представляет собой букву.

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