【问题标题】:match only words (no guarantee of spaces)仅匹配单词(不保证空格)
【发布时间】:2021-03-17 05:17:53
【问题描述】:

我想知道是否可以得到一些帮助。

我正在尝试匹配所有单词,但我有一些要求:

  1. 单词是括号内的任何有效内容(如函数中),但函数本身不应匹配
  2. 单词的结尾或开头可能有数字
  3. 不保证单个空格(或除某些运算符之外的任何空格)

例如:y ~ word1+word2 - 3word:word4 ** word5 + Function(word6)

返回应该是["y", "word1", "word2", "3word", "word4", "word5", "word6"]

到目前为止,我得到的 regexp = "(\d?[a-zA-Z]+\d?)+" 几乎都匹配,除了列表中有一个错误的 Function

一个完整的可运行示例:

import string
from typing import List
import re
q_str = "y ~ word1+word2 - 3word:word4        ** word5 + Function(word6)"

regexp = "(\d?[a-zA-Z]+\d?)+"

re.findall(regexp, q_str)

【问题讨论】:

  • 为什么Function 会失败?您的哪一项要求没有通过?
  • 啊,抱歉。我已经更新了规则 1 以反映这一点。谢谢你接听!

标签: python regex string


【解决方案1】:

你可以使用

\b\d?[a-zA-Z]+\d?\b(?!\s*\()

模式匹配

  • \b\d?[a-zA-Z]+\d?\b 在左右可选数字之间匹配 1+ 个字符 a-zA-Z
  • (?!\s*\() 负前瞻,断言不是可选的空白字符,后跟(

查看regex demoPython demo

示例代码

import re

pattern = r"\b\d?[a-zA-Z]+\d?\b(?!\s*\()"
s = "y ~ word1+word2 - 3word:word4        ** word5 + Function(word6)"
print(re.findall(pattern, s))

输出

['y', 'word1', 'word2', '3word', 'word4', 'word5', 'word6']

【讨论】:

    【解决方案2】:

    您需要一个“负前瞻”:如果后面跟着一个括号,则失败。那是 (?!():

    regexp = "(\d?[a-zA-Z]+\d?)+(?!\()"
    

    【讨论】:

      【解决方案3】:
      regex = r"(\w+)(?!\()\W+"
      

      匹配您示例中的所有内容。

      编辑:没有看到你不想要括号前面的单词,添加了一个否定的前瞻来捕捉它。

      \w 匹配任何字母、数字或下划线。等价于 [a-zA-Z0-9_]。

      \W 匹配除字母、数字或下划线以外的任何内容。等价于 [^a-zA-Z0-9_]

      您可以在此处查看结果: https://regex101.com/r/N1kdf1/1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-21
        • 1970-01-01
        • 1970-01-01
        • 2018-06-12
        • 2017-08-23
        • 2013-07-09
        • 1970-01-01
        相关资源
        最近更新 更多