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

*(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_)。谁能帮我在 python 中做到这一点?

最佳答案

要将您的模式转换为正则表达式,您首先需要确保每个字符都按字面解释而不是特殊字符。我们可以通过在任何 \ 特殊字符前插入 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 边界字符之间。

关于python - 正则表达式检查它是否恰好是一个单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50939856/

10-11 22:54
查看更多