我有一个模式看起来像:
abc*_def(##)
我想看看这是否匹配一些字符串。 E.x.匹配:
abc1_def23
abc10_def99
但不适用于:
abc9_def9
所以*代表一个可以有一个或多个数字的数字。 #代表一位数字 我想要括号中的值作为结果
解决这个问题最简单最简单的方法是什么? 通过正则表达式替换*和#,然后查看它们是否匹配? 像这样:
pattern = pattern.replace('*', '[0-9]*')
pattern = pattern.replace('#', '[0-9]')
pattern = '^' + pattern + '$'
还是自己编程?你知道吗
我很难让这件事成功。诀窍是
$
你可以像这样匹配你的模式:
^{}
abc
逐字匹配\d+
匹配一个或多个数字_
匹配下划线def
-逐字匹配(
捕获组(您的两个数字将在此组中)\d{2}
匹配2个数字)
关闭捕获组例如,您可以使用search检查匹配,并使用
.group(1)
获取括号之间的数字。你知道吗Demo Python
您还可以添加单词边界:
^{}
根据您的要求,我会选择regex,原因很简单,因为它已经可以使用并经过测试,所以正如您所要求的那样,它是最简单的。你知道吗
在您的需求中,唯一“复杂”的事情是避免在
def
之后使用与abc
之后相同的数字。 这可以通过negative backreference实现。您可以使用的正则表达式是:\b
捕获单词边界;如果将regex括在两个\b 将搜索限制为单词,即用空格分隔的文本, 标点符号等abc
捕获字符串abc
\d+
捕获一个或多个数字;如果您想要的位数有上限,则必须是\d{1,MAX}
,其中MAX是您的最大位数;总之\d
表示一个数字,+
表示一个或多个重复(\d+)
是一个组:使用括号将\d+
定义为您希望在regex中“记住”的内容;它在某种程度上类似于定义一个变量;在本例中,(\d+)
是您的第一个组,因为您在它之前没有定义任何其他组(即在它的左侧)_def
捕获字符串_def
(?!\1)
是你说“我不想重复_def
之后的第一组。\1
表示第一组,而(?)?!whatever)是一个检查,结果为正的是当前位置后面的内容不是(由!
给出的否定)whatever
您想要否定。你知道吗现场演示here。你知道吗
相关问题 更多 >
编程相关推荐