我是Python(和编程人员)菜鸟,而且我正尝试使用Python 3提取Markdown斜体文本,例如
*R v Stephenson*
从一个单独的文件中的多行文本块中提取,然后将其转储到一个集中。我的代码如下:
import re
filename = input("Name of file: ")
readfile = open(filename, "r+").read()
cases = re.findall(r"\*.*\b\s\bv\b\s\b.*\*",readfile)
print("All cases:", cases)
它工作正常,除非同一行中有多个斜体,例如:
*R v Stephenson* was a case, but so was *R v Stephens*, and the two should not be confused.
在这些情况下,它将第一个星号和最后一个星号之间的整个部分添加到集合中。如何说服Python分别对待正则表达式的每个实例?更重要的是,有人知道为什么会这样吗?
谢谢!
最佳答案
这里的问题是,正则表达式中的*
(以及+
和?
)默认情况下是贪婪的,这意味着它们将匹配尽可能多的字符。您可以使用?
将正则表达式设为非贪婪:
cases = re.findall(r"\*.*?\b\s\bv\b\s\b.*?\*",readfile)
DEMO
Detailed Explanation