如果自己设计的模式匹配

时间:2018-03-17 06:05:47

标签: python regex match

我的模式如下:

abc*_def(##)

我希望看看这是否匹配某些字符串。 E.x.它匹配:

abc1_def23
abc10_def99

但不匹配:

abc9_def9

所以*代表一个可以有一个或多个数字的数字。 #代表一位数的数字 我希望括号中的值为结果

这个问题最简单,最简单的解决方案是什么? 替换*和#到regex表达式然后查看它们是否匹配? 像这样:

    pattern = pattern.replace('*', '[0-9]*')
    pattern = pattern.replace('#', '[0-9]')
    pattern = '^' + pattern + '$'

或者自己编程?

3 个答案:

答案 0 :(得分:0)

根据您的要求,我会选择一个正则表达式,原因很简单,因为它已经可用并经过测试,所以它最简单,就像您要求的那样。

您的要求中唯一“复杂”的事情就是在def abc之后的\babc(\d+)_def((?!\1)\d{1,2})\b 相同的数字之后避免。 这可以使用negative backreference来完成。你可以使用的正则表达式是:

\b
  • abc捕获字边界;如果你把你的正则表达式括在两个\ b之间 您将搜索限制为单词,即由空格分隔的文本, 标点符号
  • abc捕获字符串\d+
  • \d{1,MAX}捕获一个或多个数字;如果你想要的位数有一个上限,它必须是\d,其中MAX是你的最大位数;无论如何+代表一个数字而(\d+)代表一个或多个重复
  • \d+是一个群组:使用括号将(\d+)定义为您想要在正则表达式中“记住”的内容;它在某种程度上类似于定义一个变量;在这种情况下,_def是您的第一个群组,因为您之前没有定义任何其他群组(即在其左侧)
  • _def捕获字符串(?!\1)
  • _def是您说“我不想在\1之后重复第一组的部分。!代表第一组,而(?!无论如何)是检查结果是肯定的是当前位置是否为NOT(否定由whateverpublic class Zoo { public List<Animal> Animals { get; set; } } public class Animal { public string Name { get; set; } } 给出否定。

现场演示here

答案 1 :(得分:0)

我最难让这个工作。诀窍是$

#!python2

import re

yourlist = ['abc1_def23', 'abc10_def99', 'abc9_def9', 'abc955_def9', 'abc_def9', 'abc9_def9288', 'abc49_def9234']

for item in yourlist:
    if re.search(r'abc[0-9]+_def[0-9][0-9]$', item):
        print item, 'is a match'

答案 2 :(得分:0)

您可以匹配您的模式:

abc\d+_def(\d{2})

  • abc按字面意思匹配
  • \d+匹配1位或更多位数
  • _匹配下划线
  • def - 按字面意思匹配
  • (捕获群组(您的2位数字将在此群组中)
    • \d{2}匹配2位数字
  • )关闭捕获组

然后你可以使用search来检查匹配并使用.group(1)来获取括号之间的数字。

Demo Python

您还可以添加字边界:

\babc\d+_def(\d{2})\b