Python正则表达式生成单词直到找到字符或特殊单词

时间:2018-03-23 07:42:03

标签: python regex python-3.x

现在已经挣扎了好几个小时了,因为某种原因似乎无法理解正念法。

我正在使用这种模式逐行查看下面的字符串:

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 
"""

2 个答案:

答案 0 :(得分:1)

您可以使用re.sub

str = re.sub(r'\s*(?:[&,]|Featuring).*', '', str)

RegEx Demo

\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 demoanother one。就其结果而言,正则表达式是等效的。

<强>详情

  • ^ - 开始行
  • (?:(?!\bFeaturing\b)[^&,\n])* - (请参阅more about this construct)除&,以外的任何字符和尽可能多的新行,但不会启动整个单词{{ 1}}。
  • Featuring - 字边界

  • \b - 匹配除换行符之外的任何0+字符,尽可能少(.*?(?=\s*(?:\bFeaturing\b|[&,]|$)))到最左边出现的0+空格后跟......

    • .*? - 全文\bFeaturing\b
    • Featuring - [&,]&字符
    • , - 行尾