Регулярное выражение слова - PullRequest
2 голосов
/ 02 июля 2019

Я хочу получить шаблоны, включающие полные слова, а не кусочки слов. Например. 12345 [some word] 1234567 [some word] 123 1679. Случайный текст и шаблон появляется снова 1111 123 [word] 555.

Это должно вернуть

[[12345, 1234567, 123, 1679],[1111, 123, 555]]

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

Я запускаю это в python3. Я пытался:

\b(\d+)\b\s\b(\w+)?\b\s\b(\d+)\b

но я не уверен, как масштабировать это до неограниченного количества совпадений.

re.findall('\b(\d+)\b\s\b(\w+)?\b\s\b(\d+)\b', string)

Это соответствует [number] [word] [number], но не любому числу, которое может следовать с или без слова между ними.

Ответы [ 3 ]

2 голосов
/ 02 июля 2019

Вы не можете сделать это за одну операцию с двигателем Python re .
Но вы можете сопоставить последовательность с одним совпадением, а затем извлечь
цифры с другой.

Это соответствует последовательности

r"(?<!\w)\d+(?:(?:[^\S\r\n]+[a-zA-Z](?:\w*[a-zA-Z])*)?[^\S\r\n]+\d+)*(?!\w)"

https://regex101.com/r/73AYLU/1

Объяснил

 (?<! \w )                     # Not a word behind
 \d+                           # Many digits
 (?:                           # Optional word block
      (?:                           # Optional words
           [^\S\r\n]+                    # Horizontal whitespace
           [a-zA-Z]                      # Starts with a letter
           (?: \w* [a-zA-Z] )*           # Can be digits in middle, ends with a letter
      )?                            # End words, do once
      [^\S\r\n]+                    # Horizontal whitespace
      \d+                           # Many digits
 )*                            # End word block, do many times
 (?! \w )                      # Not a word ahead

Получает массив цифр из последовательности, приведенной выше (используйте findall)

r"(?<!\S)(\d+)(?!\S)"

https://regex101.com/r/BHov38/1

объяснил

 (?<! \S )              # Whitespace boundary
 ( \d+ )                # (1)
 (?! \S )               # Whitespace boundary
1 голос
/ 02 июля 2019

Вы ожидаете, что re.findall() вернет список списков?Он будет возвращать только список - независимо от того, какое регулярное выражение вы используете.

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

import re
inputArray = re.split('<pattern>',inputText)
outputArray = []
for item in inputArray:
    outputArray.append(re.findall('\b(\d+)\b\s\b(\w+)?\b\s\b(\d+)\b', item))

хитростьнайти <pattern>, чтобы разделить ваш ввод.

0 голосов
/ 02 июля 2019

Это немного сложно, может быть, это выражение будет просто посмотреть:

(((\d+)\s*)*(?:\s*\[.*?\]\s*)((\d+)\s*)*)|([A-za-z\s]+)

и написать остальную часть проблемы для правильного решения.

Демо

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