首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个值的前瞻性断言

具有多个值的前瞻性断言
EN

Stack Overflow用户
提问于 2017-04-07 09:55:27
回答 4查看 278关注 0票数 0

我有以下案文:

代码语言:javascript
复制
[red]

aaa [bbb] hello

[blue]

aaa

[green]

ccc

我想提取各节标题之间的所有文本。我尝试了从特定节头到另一个标头列表中匹配的前瞻性断言:

代码语言:javascript
复制
keys = ('red', 'blue', 'green')
for key in keys:
    match = re.search(r'\[' + key + r'\](.*)(?=(?:' + '|'.join(keys) + r'|$))',
                      text, flags=re.DOTALL)

    print(key, match.group(1))

不过,我漏掉了一些东西,因为它与任何东西都不匹配。有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-04-07 11:58:13

最后,我决定不使用正则表达式来匹配部分内容。

代码语言:javascript
复制
# Walk through the file line by line and collect text from the specific sections
keys = ('red', 'blue', 'green')
last_section = ''
for line in text.splitlines():
    if line.startswith('#'):
        continue

    match = re.match(r'^\[(' + '|'.join(keys) + ')\]', line)
    if match:
        last_section = match.group(1)
        continue

    if last_section:
        new_contents[last_section] += '\n' + line

for section in new_contents:
    new_contents[section] = new_contents[section].strip()
票数 0
EN

Stack Overflow用户

发布于 2017-04-07 10:26:36

你能找到的!你可以把你的部分和它中的值组合在一起,

代码语言:javascript
复制
>>> import re
>>> print re.findall(r'\[(\w*)\]([\w \n]*)',text)
[('red', '\n\naaa '), ('bbb', ' hello\n\n'), ('blue', '\n\naaa\n\n'), ('green', '')]

这里是您的部分\[(\w*)\]([\w \n]*),用于您节中的内容。有了这个结果,您可以删除或替换多余的换线!

希望能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2017-04-07 10:54:46

也许像这样的方法可以奏效:

代码语言:javascript
复制
keys = ('red', 'blue', 'green')

res = re.findall(r'\[\w+\].?|([\w\[\] ]+)', text)
res = [x for x in res if x]

for n in range(len(keys)):
    print(keys[n], res[n])

结果:

代码语言:javascript
复制
('red', 'aaa [bbb] hello')
('blue', 'aaa')
('green', 'ccc')

示例

https://regex101.com/r/p55ckh/1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43275114

复制
相关文章

相似问题

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