python - 如何在包含至少一个下划线和大写字母的字符串中查找单词
问题描述
我想匹配包含的字符串中的所有单词
- 至少一个下划线(但单词既不能以其开头也不能以它结尾)
- 至少两个大写字母
- 所有字母必须大写。
例如(这是我得到的最好结果):
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)
我想从搜索方法中获得的词是:
- TEST_STRING(第二个词,不是_TEST_STRING_的子串)
- ANOTHER_TEST_STRING
但我正在获得
- TEST_STRING
- TEST_STRING(_TEST_STRING_ 的子字符串)。
谢谢
解决方案
您正则表达式(\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']
推荐阅读
- netsuite - 如何在 SuiteScript 中加载发票记录?
- r - 如何从文件夹中读取多个文件并更改 r 中的列名
- java - 将函数作为参数传递给另一个类中的另一个函数
- c - 有人请告诉我为什么我的代码给了我错误的答案。程序应该接受整数输入并给出相应的阶乘。我
- r - R中的日期转换问题
- pandas - Pandas Groupby - 基于多个条件的有效选择/过滤组?
- r - R / Shiny:在下拉列表中选择的列上分组和汇总?
- nuxt.js - 使用 Nuxt JS “运行生成”后没有创建 Content-Security-Policy HTTP 标头
- javascript - 将字符串中的“he”替换为“she”(与“the”重叠)
- javascript - 在 JavaScript 上对数组元素进行排序