通过最后一个模式分割字符串的正则表达式

6

我正在使用正则表达式将字符串 <书名> by <作者名> 拆分成书名和作者姓名。

re.split(r'\bby\b', text, 0, re.I)

但是当书名中包含“by”这个词时会出现问题(例如Death by Blackhole by Tyson =>['Death', 'by Black...']

我该如何通过搜索模式的最后一个出现位置来拆分字符串?

我有一个直觉——正/负面向前/向后看可能在这里有用,但目前正在努力构建正确的语法。


2
尝试使用re.split(r'\bby\b(?!.*\bby\b)', text, 0, re.I) - Wiktor Stribiżew
1
你不能只匹配结果吗?这个^(.+)\bby\b(.+)$可以同时匹配作者和标题(+是贪婪的,所以会取最后一个出现的)。 - ssc-hrep3
4个回答

6
您可以在“by”前使用贪婪的“.*” 来使用“findall”:
re.findall(r'(.*)\s+by\s+(.*)', text, re.I)

repl.it上查看。

4
你可以使用这个单一的正则表达式:
re.search('((.*( by )?.*) by (.*))',text).group(2,4)

enter image description here


4
你可以从分割中重构:
```html

你可以从分割中重构:

```
parts = re.split(r'\bby\b', text, 0, re.I)
book, author = 'by'.join(parts[:-1]), parts[-1]

或者进行完全匹配:

match = re.match(r'(.*)\bby\b(.*)', text, re.I)

4
你可以尝试这个,它将匹配最后一个“by”,在你的示例上进行了测试。
by(?!.*by.*)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接