如何在包含至少一个下划线和大写字母的字符串中查找单词

时间:2019-01-11 16:12:47

标签: python regex

我想匹配包含

的字符串中的所有单词
  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 :(得分:3)

您正则表达式(\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 demo | Python demo

答案 1 :(得分:0)

这应该有效:

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']