当前位置: 首页 > 面试题库 >

正则表达式:如何访问一个组的多个匹配项?

壤驷雅达
2023-03-14
问题内容

我正在整理一个相当复杂的正则表达式。表达式的一部分与字符串匹配,例如’+ a’,’-57’等。A+或a-
后跟任意数量的字母或数字。我想匹配0个或更多匹配此模式的字符串。

这是我想出的表达方式:

([\+-][a-zA-Z0-9]+)*

如果我使用这种模式搜索字符串’-56 + a’,我希望得到两个匹配项:

+ a和-56

但是,我只得到返回的最后一场比赛:

>>> m = re.match("([\+-][a-zA-Z0-9]+)*", '-56+a')
>>> m.groups()
('+a',)

查看python文档,我看到:

如果一个组多次匹配,则只能访问最后一个匹配项:

>>> m = re.match(r"(..)+", "a1b2c3")  # Matches 3 times.
>>> m.group(1)                        # Returns only the last match.
'c3'

所以,我的问题是:如何 您可以访问多个小组赛?


问题答案:

*从您的正则表达式中删除(因此它与您的模式的一个实例完全匹配)。然后使用re.findall(...)re.finditer(请参阅此处)返回所有匹配项。

更新:

听起来您实际上是在构建递归下降解析器。对于相对简单的解析任务,手工完成是相当普遍且完全合理的。如果您对库解决方案感兴趣(例如,以后解析任务可能变得更复杂),请查看pyparsing。



 类似资料:
  • 给定下面的字符串 [NeMo(PROD)]10.10.100.100(EFA-B-3)[博科FC-Switch]传感器:电源#1(SNMP自定义表)关闭(无此名称(SNMP错误#2)) 我尝试获取多个匹配项以提取以下值: 因为我是正则表达式的初学者,所以我试图定义一些“规则”: 提取第一个圆括号内的第一个值,例如PROD 提取第一个闭合方括号和第二个开口圆括号之间的值,例如10.10.100.10

  • 我需要使用通配符类型搜索筛选一组字符串,如下所示: 寻找应该匹配你好,但不是Helo 查找应该匹配"pant"和"想要"但不匹配"ant" 寻找应该匹配"吉普赛人"和"典型" 代表一个或多个字符。我不介意手写或基于正则表达式的搜索。有什么想法吗?典型的。NET方法的通配符匹配0或更多,但我需要1个或更多字符。我该怎么做?

  • 问题内容: 我想使用正则表达式匹配字符串的一部分,然后访问带括号的子字符串: 我究竟做错了什么? 我发现上面的正则表达式代码没有任何问题:我要针对的实际字符串是: 报告“%A”未定义似乎是一个非常奇怪的行为,但与该问题没有直接关系,因此我打开了一个新的代码, 为什么匹配的子字符串在JavaScript中返回“未定义”? 。 问题在于它的参数就像一条语句一样,并且由于我正在记录的字符串()具有特殊值

  • 由于lua不能使用|、{}等匹配方式,请问gmatch如何能实现(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|8[1-3])这样的匹配规则?

  • 问题内容: 如何匹配“ Hello world”或“ Hello World”形式的句子。该句子可能包含“-/数字0-9”。任何信息对我都会非常有帮助。谢谢。 问题答案: 这将做得很好。我对句子的定义:句子以非空格开头,以句点,感叹号或问号(或字符串结尾)结尾。标点符号后可能会有一个结束语。 这是输出: 正确地匹配所有这些(最后一个句子没有结尾标点符号),看起来似乎并不那么容易!

  • 问题内容: 我只是想知道是否可以使用一个正则表达式来匹配另一个,这是某种形式的: 正则表达式完全可以实现这种功能吗?我正在使用python进行工作,因此有关该模块实现的任何建议都将有所帮助,但我将尽我所能获取有关正则表达式的信息。 编辑:好的,显然需要按顺序进行澄清!我绝对知道正常的匹配语法如下所示: 但是我想知道正则表达式是否能够匹配我在上面试图解释的非语法正确版本中的其他较不具体的表达式,bx