如果自行设计的模式匹配,请检入python

2024-06-28 11:06:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模式看起来像:

abc*_def(##)

我想看看这是否匹配一些字符串。 E.x.匹配:

abc1_def23
abc10_def99

但不适用于:

abc9_def9

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

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

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

还是自己编程?你知道吗


Tags: 字符串def模式代表数字replace括号pattern
3条回答

我很难让这件事成功。诀窍是$

#!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'

你可以像这样匹配你的模式:

^{}

  • abc逐字匹配
  • \d+匹配一个或多个数字
  • _匹配下划线
  • def-逐字匹配
  • (捕获组(您的两个数字将在此组中)
    • \d{2}匹配2个数字
  • )关闭捕获组

例如,您可以使用search检查匹配,并使用.group(1)获取括号之间的数字。你知道吗

Demo Python

您还可以添加单词边界:

^{}

根据您的要求,我会选择regex,原因很简单,因为它已经可以使用并经过测试,所以正如您所要求的那样,它是最简单的。你知道吗

在您的需求中,唯一“复杂”的事情是避免在def之后使用与abc之后相同的数字。 这可以通过negative backreference实现。您可以使用的正则表达式是:

\babc(\d+)_def((?!\1)\d{1,2})\b
  • \b捕获单词边界;如果将regex括在两个\b 将搜索限制为单词,即用空格分隔的文本, 标点符号等
  • abc捕获字符串abc
  • \d+捕获一个或多个数字;如果您想要的位数有上限,则必须是\d{1,MAX},其中MAX是您的最大位数;总之\d表示一个数字,+表示一个或多个重复
  • (\d+)是一个组:使用括号将\d+定义为您希望在regex中“记住”的内容;它在某种程度上类似于定义一个变量;在本例中,(\d+)是您的第一个组,因为您在它之前没有定义任何其他组(即在它的左侧)
  • _def捕获字符串_def
  • (?!\1)是你说“我不想重复_def之后的第一组。\1表示第一组,而(?)?!whatever)是一个检查,结果为正的是当前位置后面的内容不是(由!给出的否定)whatever您想要否定。你知道吗

现场演示here。你知道吗

相关问题 更多 >