现在已经挣扎了好几个小时了,因为某种原因似乎无法理解正念法。
我正在使用这种模式逐行查看下面的字符串:
pattern = re.compile(r"^[^&,]*")
字符串保存在字典中,因此像这样循环遍历:
for dct in lst:
print(re.search(pattern, dct['artist']).group(0))
"""
Drake
Post Malone Featuring Ty Dolla $ign
BlocBoy JB Featuring Drake
Offset & Metro Boomin
Jay Rock, Kendrick Lamar, Future & James Blake
"""
上面给出了我的预期:
"""
Drake
Post Malone Featuring Ty Dolla $ign
BlockBoy JB Featuring Drake
Offset
Jay Rock
"""
但我无法弄清楚如何添加它也应该停留在字符串“特色”,我尝试了不同的100种变体\ bFeaturing \ b,大写B
,前面有不同的标记,返回,regex
中的位置。
这是我最接近的,但它只匹配具有“特色”的行:
pattern = re.compile(r"^[^&,]*(?=\bFeaturing\b)")
这给了我这个输出:
None
<_sre.SRE_Match object; span=(0, 12), match='Post Malone '>
<_sre.SRE_Match object; span=(0, 11), match='BlocBoy JB '>
None
<_sre.SRE_Match object; span=(0, 12), match='Post Malone '>
None
我对此很新,因此我所做的大部分工作都是反复试验,但我正处于放弃的边缘。请帮我得到这样的结果:
"""
Drake
Post Malone
BlockBoy JB
Offset
Jay Rock
"""
答案 0 :(得分:1)
您可以使用re.sub
:
str = re.sub(r'\s*(?:[&,]|Featuring).*', '', str)
\s*(?:[&,]|Featuring).*
会匹配任意行中&
或,
或Featuring
开头的文字,直到行尾,我们将其替换为空字符串。
答案 1 :(得分:1)
您可以使用
re.findall(r'^(?:(?!\bFeaturing\b)[^&,\n])*\b', s, re.M)
或
re.findall(r'^.*?(?=\s*(?:\bFeaturing\b|[&,]|$))', s, re.M)
请参阅this regex demo或another one。就其结果而言,正则表达式是等效的。
<强>详情
^
- 开始行(?:(?!\bFeaturing\b)[^&,\n])*
- (请参阅more about this construct)除&
,,
以外的任何字符和尽可能多的新行,但不会启动整个单词{{ 1}}。 Featuring
- 字边界
\b
- 匹配除换行符之外的任何0+字符,尽可能少(.*?(?=\s*(?:\bFeaturing\b|[&,]|$))
)到最左边出现的0+空格后跟......
.*?
- 全文\bFeaturing\b
Featuring
- [&,]
或&
字符,
- 行尾