正则表达式,花括号的含义

时间:2016-08-08 08:02:16

标签: python regex

我目前正在处理一些python代码,它使用" re"用于在给定项目列表中搜索具有正则表达式模式的项目的python包。

当我查看代码时,我遇到了一些我无法理解的关于正则表达式的花括号的内容。

代码片段是这样的。

regex = re.search("mov .* ptr \[(?P<dst>([(rax)|(rbx)|(rcx)|(rdx)|(rsi)|(rdi)|(r9)|(r10)|(r11)|(r12)|(r13)|(r14)|(r15)]{3}))\], (?P<src>([(rax)|(rbx)|(rcx)|(rdx)|(rsi)|(rdi)|(r9)|(r10)|(r11)|(r12)|(r13)|(r14)|(r15)]{3}))$", f)

f是给定的输入,看起来像这样。

正则表达式变为1,我打印了f的内容,它显示如下。

&#34; mov qword ptr [rsi],rdi&#34;

我无法理解的是正则表达式中的花括号,在本例中为&#34; {3}&#34;。 据我所知,花括号只有一个数字&#39; n&#39;用于表示前面的表达式需要准确显示&#39; n&#39;为了匹配的时间(在我的情况下是三次)。 (例如,ab {3}会导致abbb匹配)

所以,如果这是正确的,我认为其中一个是&#34;(rax),(rbx),(rcx)等。&#34;为了匹配,需要正好出现三次,但关于上面显示的f的内容,情况并非如此。

所以我想知道我错过了什么,以及如何理解上面正则表达式中的花括号。

3 个答案:

答案 0 :(得分:2)

提供的正则表达式错误地使用方括号。括号表示一组字符,因此在这些字符后面的{3}表示这三个字符的任意组合将匹配。您可以在[]下找到文档here

我相信正确的正则表达式会是这样的:

regex = re.search(
    'mov .* ptr '
    '\[(?P<dst>(rax|rbx|rcx|rdx|rsi|rdi|r9|r10|r11|r12|r13|r14|r15))\], '
    '(?P<src>(rax|rbx|rcx|rdx|rsi|rdi|r9|r10|r11|r12|r13|r14|r15))$', f)

答案 1 :(得分:0)

你所拥有的是一个虚假的正则表达式。它并没有做任何写它的人意味着要做的事情。

为了证明这一点,我给它输了一个无效的输入:

$ python2
...
>>> s = ("mov .* ptr \[(?P<dst>([(rax)|(rbx)|(rcx)|(rdx)|"
... "(rsi)|(rdi)|(r9)|(r10)|(r11)|(r12)|(r13)|(r14)|"
... "(r15)]{3}))\], (?P<src>([(rax)|(rbx)|(rcx)|(rdx)|"
... "(rsi)|(rdi)|(r9)|(r10)|(r11)|(r12)|(r13)|(r14)|(r15)]{3}))$")
>>> import re
>>> r2 = re.search(s, "mov qword ptr [r5i], rdi")
>>> r2
<_sre.SRE_Match object at 0x800684ca8>
>>> r2.group('dst')
'r5i'
>>> r2 = re.search(s, "mov qword ptr [(5i], rdi")
>>> r2.group('dst')
'(5i'
>>>

很难说出写这个表达的人的想法是什么,以及他们如何想出他们最终使用的东西。不过,你是正确的,{3}表示&#34;重复三次&#34;。

答案 2 :(得分:0)

其他人已正确回答,我只是向您展示了一种可视化/测试正则表达式模式的方法。

Regular expression visualization

Debuggex Demo