Regex noob вопрос: получить несколько слов / предложений из одной строки, максимальное разделение составляет 1 пробел? - PullRequest
2 голосов
/ 27 июня 2019

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

Моя проблема заключается в следующем: задана строка типа ' Apple Banana Cucumber Alphabetical Fruit Whoops' Я пытаюсь использовать модуль re.findall в python для получения списка, который выглядит следующим образом: my_list = [' Apple', ' Banana', ' Cucumber', ' Alphabetical Fruit', ' Whoops'].Другими словами, я пытаюсь найти выражение регулярного выражения, которое может [искать кучу пробелов, за которыми следует некоторое непробельное пространство], а затем проверить, существует ли один пробел с еще несколькими непробельными символами после этого.

Это функция, которую я написал, которая заставляет меня закрывать , но не совсем:

re.findall("\s+\S+\s{1}\S*", my_list)

В результате:

[' Apple ', ' Banana ', ' Cucumber ', ' Alphabetical Fruit']

Я думаю, что этот результат имеет смысл.Сначала он находит пробел, затем некоторое непробельное пространство, но затем ищет хотя бы один пробел (который пропускает «Whoops»), а затем ищет любое количество других непробельных символов (поэтому после пробела«Алфавитный фрукт»).Я просто не знаю, какая комбинация символов дала бы мне ожидаемый результат.

Любая помощь будет чрезвычайно цениться!-WW

Ответы [ 2 ]

4 голосов
/ 27 июня 2019

Вы можете сделать:

\s+\w+(?:\s\w+)?
  • \s+\w+ выделяет один или несколько пробелов, за которыми следует один или несколько из [A-Za-z0-9_]

  • (?:\s\w+)? - это условная (?, ноль или одна) не захваченная группа ((?:)), которая соответствует пробелу (\s), за которым следует один или несколько из [A-Za-z0-9_] (\w+). По сути, это соответствует Fruit в Alphabetical Fruit.

Пример:

In [701]: text = '     Apple     Banana     Cucumber    Alphabetical Fruit   Whoops'                                                                                                                        

In [702]: re.findall(r'\s+\w+(?:\s\w+)?', text)                                                                                                                                                             
Out[702]: 
['     Apple',
 '     Banana',
 '     Cucumber',
 '    Alphabetical Fruit',
 '   Whoops']
2 голосов
/ 27 июня 2019

Ваш шаблон уже работает, просто сделайте вторую часть (часть «составное слово») необязательной:

\s+\S+(\s\S+)?

https://regex101.com/r/Ua8353/3/

(фиксированный \s{1} за @heemayl)

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