Как найти слова в строке, содержащей хотя бы одно подчеркивание и заглавные буквы - PullRequest
0 голосов
/ 11 января 2019

Я бы хотел сопоставить все слова в строке, содержащей

  1. хотя бы одно подчеркивание (но слово не может ни начинаться, ни заканчиваться на нем)
  2. как минимум две заглавные буквы
  3. все буквы должны быть заглавными.

Например (и это лучший результат, который я получил):

test_string = "test_string TEST_STRING TEST_string _TEST_STRING_ TESTSTRING ANOTHER_TEST_STRING"
p = re.compile("(\S*[A-Z_]\S*[_]\S*)") 
p.search(test_string)

Слова, которые я хотел бы получить из метода поиска:

  1. TEST_STRING (второе слово, а не подстрока _TEST_STRING _)
  2. ANOTHER_TEST_STRING

Но я получаю

  1. TEST_STRING
  2. TEST_STRING (которая является подстрокой _TEST_STRING _).

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вы regex (\S*[A-Z_]\S*[_]\S*) использует \S*, который будет соответствовать непробельному символу и повторять это 0+ раз, так что вы, например, также соответствует __ или A_

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

\b[A-Z]+_[A-Z_]*[A-Z]\b

Объяснение

  • \b Граница слова
  • [A-Z]+ Совпадение с 1 + заглавными буквами
  • _ Подчеркивание совпадений
  • [A-Z_]* Совпадение 0+ раз либо в верхнем регистре, либо в подчеркивании
  • [A-Z] Соответствует символу в верхнем регистре
  • \b Граница слова

re.search вернет первое место, где совпадает регулярное выражение. Вы можете использовать findall вместо:

import re
test_string = "test_string TEST_STRING TEST_string _TEST_STRING_ TESTSTRING ANOTHER_TEST_STRING"
p = re.compile(r"\b[A-Z]+_[A-Z_]*[A-Z]\b") 
print(re.findall(p,test_string))

Результат

['TEST_STRING', 'ANOTHER_TEST_STRING']

См. Демоверсию regex | Python demo

0 голосов
/ 11 января 2019

Это должно работать:

import re

regex = r"\b([A-Z]+(?:_[A-Z]+){1,})\b"
test_str = "test_string TEST_STRING TEST_string _TEST_STRING_ TESTSTRING ANOTHER_TEST_STRING"
matches = re.findall(regex, test_str, re.MULTILINE)

Выход:

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