我有一个像这种格式的文字,
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
所以我想知道是否存在一些正则表达式可以将它直接拆分为这些部分?
答案 0 :(得分:2)
其中一种方法:
import re
s = '[aaa]foo[bbb]bar[ccc]foobar'
result = re.findall(r'\[[^]]+\][^\[\]]+', s)
print(result)
输出:
['[aaa]foo', '[bbb]bar', '[ccc]foobar']
\[
或\]
- 按字面匹配括号[^]]+
- 匹配除]
[^\[\]]+
- 匹配括号\[\]
答案 1 :(得分:1)
我认为这可行:
r'\[.+?\]\w+'
答案 2 :(得分:1)
这是:
>>> re.findall(r"(\[\w*\]\w+)",s)
['[aaa]foo', '[bbb]bar', '[ccc]foobar']
<强>解释强>:
\[
后跟一些字母\w
\]
后跟更多字母\w
请注意,您应该使用\
进行制止。
答案 3 :(得分:0)
\[.*?\][a-zA-Z]*
这个正则表达式应该捕获任何以[wherehere]开头的东西。从a到Z的任何字母
你可以在regex101上玩试用不同的版本,并且很容易在那里制作你自己的正则表达式
答案 4 :(得分:0)
我认为如果输入字符串格式足够严格&#34;,那么可以尝试使用regexp。它可能看起来像一个微观优化,但作为一种挑战可能会很有趣。
result = map(lambda x: '[' + x, s[1:].split("["))
所以我尝试检查1Mil迭代的性能,这是我的结果(秒):
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
答案 5 :(得分:0)
你需要的只是findall,这里是非常简单的模式而不会让它变得复杂:
import re
print(re.findall(r'\[\w+\]\w+','[aaa]foo[bbb]bar[ccc]foobar'))
输出:
['[aaa]foo', '[bbb]bar', '[ccc]foobar']
详细解决方案:
import re
string_1='[aaa]foo[bbb]bar[ccc]foobar'
pattern=r'\[\w+\]\w+'
print(re.findall(pattern,string_1))
说明:
\[\w+\]\w+
\[ matches the character [ literally (case sensitive)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed