我的模式如下:
abc*_def(##)
我希望看看这是否匹配某些字符串。 E.x.它匹配:
abc1_def23
abc10_def99
但不匹配:
abc9_def9
所以*代表一个可以有一个或多个数字的数字。 #代表一位数的数字 我希望括号中的值为结果
这个问题最简单,最简单的解决方案是什么? 替换*和#到regex表达式然后查看它们是否匹配? 像这样:
pattern = pattern.replace('*', '[0-9]*')
pattern = pattern.replace('#', '[0-9]')
pattern = '^' + pattern + '$'
或者自己编程?
答案 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(否定由whatever
)public 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+
匹配1位或更多位数_
匹配下划线def
- 按字面意思匹配(
捕获群组(您的2位数字将在此群组中)
\d{2}
匹配2位数字)
关闭捕获组然后你可以使用search来检查匹配并使用.group(1)
来获取括号之间的数字。
您还可以添加字边界: