我正在尝试使用 Python 的 re 库在 .md 文档中获取顶级 Markdown 标题(即以单个散列开头的标题 -- # Introduction),但我终究无法解决这个问题。
这是我要执行的代码:
import re
pattern = r"(# .+?\\n)"
text = r"# Title\n## Chapter\n### sub-chapter#### What a lovely day.\n"
header = re.search(pattern, text)
print(header.string)
print(header.string)
的结果是:
# Title\n## Chapter\n### sub-chapter#### 多么美好的一天。\n
而我只想要 # Title\n
这个关于 regex101 的例子说它应该可以工作,但我不明白为什么不行。 https://regex101.com/r/u4ZIE0/9
最佳答案
你得到那个结果是因为你使用了调用 .string 的 header.string
在 Match object 上这将返回传递给 match()
或 search()
的字符串。
字符串中已经有换行符:
text = r"# Title\n## Chapter\n### sub-chapter#### What a lovely day.\n"
因此,如果您使用您的模式(请注意,它也将匹配换行符),您可以将代码更新为:
import re
pattern = r"(# .+?\\n)"
text = r"# Title\n## Chapter\n### sub-chapter#### What a lovely day.\n"
header = re.search(pattern, text)
print(header.group())
请注意 re.search查找正则表达式产生匹配项的第一个位置。
匹配您的值的另一个选项可能是从字符串的开头匹配 #
后跟一个空格,然后是除换行符之外的任何字符,直到字符串结尾:
^# .*$
例如:
import re
pattern = r"^# .*$"
text = "# Title\n## Chapter\n### sub-chapter#### What a lovely day.\n"
header = re.search(pattern, text, re.M)
print(header.group())
如果后面不能再有#
,你也可以使用negated character class不匹配 #
或换行符:
^# [^#\n\r]+$
关于python - 用于捕获部分字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56310045/