我基本上是在尝试匹配字符串模式(通配符匹配) 请仔细查看-
*(星号)-恰好意味着一个字。
这不是正则表达式模式,这是一个约定。
因此,如果有类似-
的模式*.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?
答案 0 :(得分:3)
要将模式转换为正则表达式,首先需要确保每个字符都是按字面意义解释的,而不是特殊字符。我们可以通过在任何\
特殊字符之前插入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.search
或re.findall
查找输出模式,则可能需要将re
模式包装在\b
边界字符之间。
答案 1 :(得分:2)
您要寻找的转换规则如下:
*
是一个单词,因此:\w+
.
是文字点:\.
key
是并且保持原义字符串^
到字符串$
的末尾匹配。因此,*.key
变成^\w+\.key$
,*.key.*
变成^\w+\.key\.\w+$
,依此类推。
Online Demo:玩吧!
答案 2 :(得分:0)
您可以结合使用“非句点的任何字符”和开始/结束锚点。
*.key
将是^[^.]*\.key
,而*.key.*
将是^[^.]*\.key\.[^.]*$
编辑:正如三位一体者所说,[^.]*
(与“不是句点的任何数量的字符”匹配)将允许空白字符(当然不是句点),因此使用\w+
,像其他答案一样,“任意数量的'单词字符'”更好。
答案 3 :(得分:0)
^
表示以正则表达式中的给定字符集开头的字符串。
$
表示以正则表达式中的给定字符集结尾的字符串。
\s
表示空白字符。
\S
表示非空白字符。
+
表示符合给定条件的1个或多个字符。
现在,您只想匹配一个单词,这意味着一个以无间隔字符串开头和结尾的字符串。因此,所需的正则表达式为:
^\S+$