首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >regex的不同部分匹配相同的文本,这取决于后面的内容。

regex的不同部分匹配相同的文本,这取决于后面的内容。
EN

Stack Overflow用户
提问于 2015-12-17 16:32:00
回答 1查看 106关注 0票数 0

我正在尝试编写regex (在Python程序中),以匹配如下所示的字符串:

代码语言:javascript
复制
             """(book "Moby Dick" (MLA) #foo ?bar baz)

             """(book "Moby Dick" (MLA))

             """(book "Moby Dick")

我的准则是:

代码语言:javascript
复制
(?P<indent>\s*)("""|\'\'\'|blockquote:)(\((?P<type>\w*)\s*(["\'](?P<citation>.+?)["\'])?\s*(\((?P<format>\w+?)\))?(?P<other>.+?)\))?

预期的结果是:

代码语言:javascript
复制
indent  [0-8]   `        `
type    [12-16] `book`
citation    [18-27] `Moby Dick`
format  [30-33] `MLA`
other   [34-44] ` #foo ?bar baz`

对于第一个版本的字符串,这就是我得到的。但是,对于字符串的较短版本,“其他”组捕获了文本的早期部分,因此对于我得到的第二个版本:

代码语言:javascript
复制
indent  [0-8]   `        `
type    [12-16] `book`
citation    [18-27] `Moby Dick`
other   [29-33] `(MLA`

第三,我得到的是:

代码语言:javascript
复制
indent  [0-8]   `        `
type    [12-16] `book`
other   [17-28] `"Moby Dick"`

所以我的问题是,为什么“其他”模式在前面的模式之前被匹配,我怎样才能得到模式的“引文”和“格式”部分来匹配第二和第三种情况下的预期文本?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-17 16:48:09

您还需要使(?P<other>.+?)模式成为可选的,以获得所需的结果:

代码语言:javascript
复制
reg = r'(?P<indent>\s*)("""|\'\'\'|blockquote:)(\((?P<type>\w*)\s*(["\'](?P<citation>.+?)["\'])?\s*(\((?P<format>\w+?)\))?(?P<other>.+?)?\))?'

由于它不是可选的,regex引擎至少需要一个字符才能成功匹配正则表达式。因为其他模式是.+,所以后面有一个结束括号。因此,最后两个字符串other被匹配,而不是citationformat

代码语言:javascript
复制
>>> import re
>>> 
>>> reg = re.compile(r'(?P<indent>\s*)("""|\'\'\'|blockquote:)(\((?P<type>\w*)\s*(["\'](?P<citation>.+?)["\'])?\s*(\((?P<format>\w+?)\))?(?P<other>.+?)?\))?')
>>> 
>>> 
>>> s2 = '             """(book "Moby Dick" (MLA))'
>>> 
>>> m2 = reg.match(s2)
>>> m2.groupdict()
{'indent': '             ', 'citation': 'Moby Dick', 'type': 'book', 'other': None, 'format': 'MLA'}
>>> 
>>> s3 = '             """(book "Moby Dick")'
>>> m3 = reg.match(s3)
>>> 
>>> m3.groupdict()
{'indent': '             ', 'citation': 'Moby Dick', 'type': 'book', 'other': None, 'format': None}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34339683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档