关于如何在s中找到所需的所有格式

2024-05-08 11:54:59 发布

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

我有这样的文本格式

s = '[aaa]foo[bbb]bar[ccc]foobar'

实际上这篇文章是这样的中国汽车评论

【最满意】整车都很满意,最满意就是性价比,...【空间】空间真的超乎想象,毫不夸张,...【内饰】内饰还可以吧,没有多少可以说的...

现在我想把它分成这些部分

[aaa]foo
[bbb]bar
[ccc]foobar

首先我试过了

>>> re.findall(r'\[.*?\].*?',s)
['[aaa]', '[bbb]', '[ccc]']

只有上半场。你知道吗

然后我试着

>>> re.findall(r'(\[.*?\].*?)\[?',s)
['[aaa]', '[bbb]', '[ccc]']

还是只有上半场

最后我得把这两部分分别拿出来,然后把它们拉上拉链

>>> re.findall(r'\[.*?\]',s)
['[aaa]', '[bbb]', '[ccc]']

>>> re.split(r'\[.*?\]',s)
['', 'foo', 'bar', 'foobar']

>>> for t in zip(re.findall(r'\[.*?\]',s),[e for e in re.split(r'\[.*?\]',s) if e]):
...    print(''.join(t))
...
[aaa]foo
[bbb]bar
[ccc]foobar

所以我想知道是否存在一些正则表达式可以直接将它拆分成这些部分?你知道吗


Tags: 文本格式inreforfoobar空间split
3条回答

方法之一:

import re

s = '[aaa]foo[bbb]bar[ccc]foobar'
result = re.findall(r'\[[^]]+\][^\[\]]+', s)

print(result)

输出:

['[aaa]foo', '[bbb]bar', '[ccc]foobar']

  • \[\]-按字面意思匹配括号
  • [^]]+-匹配除]之外的一个或多个字符
  • [^\[\]]+-匹配除括号\[\]以外的任何字符

我认为这可以奏效:

r'\[.+?\]\w+'

我认为如果输入字符串格式“足够严格”,就可以尝试不带regexp的东西。这看起来可能是一个微观优化,但可能是一个有趣的挑战。你知道吗

result = map(lambda x: '[' + x, s[1:].split("["))

所以我试着在1英里迭代中检查性能,下面是我的结果(秒):

result = map(lambda x: '[' + x, s[1:].split("[")) # 0.89862203598
result = re.findall(r'\[[^]]+\][^\[\]]+', s) # 1.48306798935
result = re.findall(r'\[.+?\]\w+', s) # 1.47224497795
result = re.findall(r'(\[\w*\]\w+)', s) # 1.47370815277

相关问题 更多 >

    热门问题