我正在尝试使用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#### What a lovely day.\n
而我只想要# Title\n
此示例在regex101上说应该起作用,但我不知道为什么不起作用。 https://regex101.com/r/u4ZIE0/9
答案 0 :(得分:2)
之所以得到该结果,是因为您使用header.string
,它在.string上调用Match object,这将使您返回传递给match()
或搜索{{1} }。
该字符串中已经包含换行符:
()
因此,如果您使用模式(请注意,它也将与换行符匹配),则可以将代码更新为:
text = r"# Title\n## Chapter\n### sub-chapter#### What a lovely day.\n"
请注意,re.search寻找正则表达式产生匹配项的第一个位置。
另一个与您的值匹配的选项可能是从字符串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())
的开头匹配,后跟一个空格,然后是除换行符之外的任何字符,直到该字符串的结尾:
#
例如:
^# .*$
如果之后没有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来匹配#
或换行符:
#
答案 1 :(得分:1)
我猜想我们希望提取{
"cards": [
{
"Name": "copper",
"Cost": 0
},
{
"Name": "silver",
"Cost": 3
},
{
"Name": "gold",
"Cost": 6
},
{
"Name": "curse",
"Cost": 0
},
{
"Name": "estate",
"Cost": 2
},
{
"Name": "duchy",
"Cost": 5
},
{
"Name": "province",
"Cost": 8
}
]
}
,在这种情况下,只需稍加修改,您的表情就可以正常工作>
# Title\n
(# .+?\\n)(.+)