【问题标题】:Regex to check if it is exactly one single word正则表达式检查它是否恰好是一个单词
【发布时间】:2018-06-20 23:04:12
【问题描述】:

我基本上是在尝试匹配字符串模式(通配符匹配) 请仔细看这个——

*(star) - 正好是一个词。

这不是正则表达式模式...这是一种约定。

所以,如果有这样的模式 -

*.key - '.key.' is preceded by exactly one word(word containing no dots)
*.key.* - '.key.' is preceded and succeeded by exactly one word having no dots
key.* - '.key' preceeds exactly one word .

所以,

"door.key" matches "*.key"
"brown.door.key" doesn't match "*.key".
"brown.key.door" matches "*.key.*"
 but "brown.iron.key.door" doesn't match "*.key.*"

所以,当我在模式中遇到“*”时,我已将其替换为正则表达式,这意味着它恰好是一个单词。(a-zA-z0-9_)。谁能帮我做到这一点蟒蛇?

【问题讨论】:

  • (([A-Za-z0-9_])+\.)?key(\.([A-Za-z0-9_])+)?

标签: python regex


【解决方案1】:

要将您的模式转换为正则表达式,您首先需要确保每个字符都按字面意思解释,而不是作为特殊字符。我们可以通过在任何re 特殊字符前面插入\ 来做到这一点。这些字符可以通过sre_parse.SPECIAL_CHARS获取。

由于您对* 有特殊含义,因此我们不想转义该含义,而是将其替换为\w+

代码

import sre_parse

def convert_to_regexp(pattern):
    special_characters = set(sre_parse.SPECIAL_CHARS)
    special_characters.remove('*')

    safe_pattern = ''.join(['\\' + c if c in special_characters else c for c in pattern ])

    return safe_pattern.replace('*', '\\w+')

示例

import re

pattern = '*.key'
r_pattern = convert_to_regexp(pattern) # '\\w+\\.key'

re.match(r_pattern, 'door.key') # Match
re.match(r_pattern, 'brown.door.key') # None

这是一个特殊字符转义的例子

pattern = '*.(key)'
r_pattern = convert_to_regexp(pattern) # '\\w+\\.\\(key\\)'

re.match(r_pattern, 'door.(key)') # Match
re.match(r_pattern, 'brown.door.(key)') # None

旁注

如果您打算查找带有re.searchre.findall 的输出模式,您可能需要将re 模式包装在\b 边界字符之间。

【讨论】:

    【解决方案2】:

    你正在寻找的转换规则是这样的:

    • * 是一个词,因此:\w+
    • . 是一个文字点:\.
    • key 是并保持为文字字符串
    • 另外,您的示例表明您将匹配整个字符串,这反过来意味着您的模式应该匹配从 ^ 开始到字符串的 $ 结尾。

    因此,*.key 变为 ^\w+\.key$*.key.* 变为 ^\w+\.key\.\w+$,以此类推..

    Online Demo: 玩吧!

    【讨论】:

      【解决方案3】:

      ^ 表示以正则表达式中的给定字符集开始的字符串。

      $ 表示以正则表达式中的给定字符集结束的字符串。

      \s 表示空格字符。

      \S 表示非空白字符。

      + 表示匹配给定条件的 1 个或多个字符。

      现在,您只想匹配一个单词,该单词表示以非空格字符串开头和结尾的字符串。因此,所需的正则表达式是: ^\S+$

      【讨论】:

        【解决方案4】:

        您可以结合使用“任何非句点字符”和开始/结束锚点。

        *.key 将是 ^[^.]*\.key*.key.* 将是 ^[^.]*\.key\.[^.]*$

        编辑:正如 Tripleee 所说,[^.]* 匹配“任意数量的非句点字符”,将允许空白字符(当然不是句点),因此使用 \w+,“任意数量'单词字符'”像其他答案一样更好。

        【讨论】:

        • 请注意[^.] 匹配空格。您可能想用类似\w 的东西替换它,它只匹配“单词”字符(它基本上是[a-zA-Z0-9_] 的简写)。
        • @tripleee,没想到这一点,感谢您提及。编辑了它。@shweta,希望它能成功。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-10
        • 2020-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多