正则表达式检查它是否仅是一个单词

时间:2018-06-20 03:41:43

标签: python regex

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

*(星号)-恰好意味着一个字。

这不是正则表达式模式,这是一个约定。

因此,如果有类似-

的模式
*.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?

4 个答案:

答案 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.searchre.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+$