【问题标题】:Regular expression to find a series of uppercase words in a string正则表达式在字符串中查找一系列大写单词
【发布时间】:2020-03-18 11:04:27
【问题描述】:
text = "This is a TEXT CONTAINING UPPER CASE WORDS and lower case words. This is a SECOND SENTENCE."

pattern = '[A-Z]+[A-Z]+[A-Z]*[\s]+'

re.findall(pattern, text) 给出输出 -->

['TEXT ', 'CONTAINING ', 'UPPER ', 'CASE ', 'WORDS ', 'SECOND ', 'SENTENCE ']

但是,我想要这样的输出 -->

['TEXT CONTAINING UPPER CASE WORDS', 'SECOND SENTENCE']

【问题讨论】:

  • 如果你确定一个句子是一系列单词然后一个句号,只需拆分原始文本 .split(".") ,然后将列表的每个元素放入 re.findall跨度>
  • 如果你有这样的句子怎么办:This is YOUR FIRST sentence WITH UPPERCASE words. This IS A second.?那仍然是两个元素吗?还是要将第一句的元素分成两个元素?
  • @JvdV 预期输出将是 ['YOUR FIRST', 'WITH UPPERCASE', 'IS A']
  • @tomgalpin 我认为性能会受到打击。
  • [A-Z]+[A-Z]+[A-Z]* 最好写成 [A-Z]+[\s]+ --> \s+

标签: python regex


【解决方案1】:

你可以使用这个正则表达式:

\b[A-Z]+(?:\s+[A-Z]+)*\b

RegEx Demo

正则表达式详细信息:

  • \b:字边界
  • [A-Z]+: 匹配一个只包含大写字母的单词
  • (?:\s+[A-Z]+)*:匹配 1+ 个空格,后跟另一个带有大写字母的单词。匹配此组 0 次或多次
  • \b:字边界

代码:

>>> s = 'This is a TEXT CONTAINING UPPER CASE WORDS and lower case words. This is a SECOND SENTENCE';
>>> print (re.findall(r'\b[A-Z]+(?:\s+[A-Z]+)*\b', s))
['TEXT CONTAINING UPPER CASE WORDS', 'SECOND SENTENCE']

【讨论】:

    【解决方案2】:
    1. 改进正则表达式,你需要至少2个大写字母,所以2个或更多使用专用语法{2,},并使用单词边界确保捕捉整个单词

      r'\b[A-Z]{2,}\b'
      
    2. 为每个句子做这项工作:用基本的正则表达式找到它们,并为每个句子查找大写单词,然后通过空格连接将它们保存在数组中

      result = []
      sentences = re.findall("[^.]+.", text)
      for sentence in sentences:
          uppercase = re.findall(pattern, sentence)
          result.append(" ".join(uppercase))
      print(result)  # ['TEXT CONTAINING UPPER CASE WORDS', 'SECOND SENTENCE']
      

    在列表理解中,它看起来像

    res = [" ".join(re.findall(pattern, sentence)) for sentence in re.findall("[^.]+.", text)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      相关资源
      最近更新 更多