如何使用python从标记字符串/文档中提取“#标题级别1”(标题及其段落)的文本?

2024-10-01 11:27:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要提取与传递给python函数的标题级别1字符串相匹配的文本(标题及其段落)。 下面是我工作的mardown文本示例:

# My first header

## Nec sic igni ad ad aventi

Lorem markdownum quantumque nunc, fine superi sagittis, haut regalis attollo,
ora inferius, mensor deam? Sedili quoque tauri. Quo limite ducem.

1. Arva fecit partes tosta
2. Insignia est ausae ut ut ait
3. O summa saepe

Sic ipsos, Phlegethontide nisi poterat neque quos tum partes rapitur. Filius
utraque: glande, ut exiles terram fiducia coeunt. Et caelo legit multis,
plangorem altoque; et iamque nec. Sanguine corpora prora quicquid insolida in
Parin: stupet est posses nos mater temptat, gemit num.

# My second header

## Primordia metuam his dixerat talaria cognoscenda

Lorem markdownum revulsum dilexit contra. Qui seu supplex Themis profuit quoque
Hyperionis, omnibus aesculus signa medendi. Aspiciunt rigidique finibus ducunt
postquam, huic postera lignum, properent.

- Nostro purgamina capitque longis
- Virtus suo moenibus
- Byblida longum pudibunda referre
- Via in ab vulneribus petita mirantur quamquam
- Et vela
- Nondum sacer meminisse Dircen novas dumque

例如,我需要从上面的文本中提取标题“我的第二个标题”的所有文本

我正在尝试使用正则表达式,但没有找到解决问题的正确规则

def findHeader("My second header")
r = re.compile(r"the regular expression")
    print(r.findall(text))

findHeader输出:

# My second header

## Primordia metuam his dixerat talaria cognoscenda

Lorem markdownum revulsum dilexit contra. Qui seu supplex Themis profuit quoque
Hyperionis, omnibus aesculus signa medendi. Aspiciunt rigidique finibus ducunt
postquam, huic postera lignum, properent.

- Nostro purgamina capitque longis
- Virtus suo moenibus
- Byblida longum pudibunda referre
- Via in ab vulneribus petita mirantur quamquam
- Et vela
- Nondum sacer meminisse Dircen novas dumque

Tags: in文本标题myadetheaderest
2条回答

这就是工作:

import re

text = """
# My first header

## Nec sic igni ad ad aventi

Lorem markdownum quantumque nunc, fine superi sagittis, haut regalis attollo,
ora inferius, mensor deam? Sedili quoque tauri. Quo limite ducem.

1. Arva fecit partes tosta
2. Insignia est ausae ut ut ait
3. O summa saepe

Sic ipsos, Phlegethontide nisi poterat neque quos tum partes rapitur. Filius
utraque: glande.

# My second header

## Primordia metuam his dixerat talaria cognoscenda

Lorem markdownum revulsum dilexit contra. Qui seu supplex Themis profuit quoque
Hyperionis, omnibus aesculus signa medendi.

- Nostro purgamina capitque longis
- Virtus suo moenibus

# My third header

## Primordia metuam his dixerat talaria cognoscenda

Lorem markdownum revulsum dilexit contra. Qui seu supplex Themis profuit quoque
postquam, huic postera lignum, properent.

"""
def findHeader(search):
    r = re.compile(r"(?<!#)# " + search + r"(?s)(?:(?!(?<!#)# ).)+")
    return(r.findall(text))
    
print(findHeader("My second header"))

输出:

['# My second header\n\n## Primordia metuam his dixerat talaria cognoscenda\n\nLorem markdownum revulsum dilexit contra. Qui seu supplex Themis profuit quoque\nHyperionis, omnibus aesculus signa medendi.\n\n- Nostro purgamina capitque longis\n- Virtus suo moenibus\n\n']

说明:

r"          # raw string
    (?<!#)      # negative lookbehind, make sure we haven't a # before
    #           # a # and a space
"           # end string
+           # concat
    search      # header to be searched
+           # concat
r"          # raw string
    (?s)        # . matches newline
    (?:         # non capture group (Tempered greedy token)
        (?!         # negative lookahead, mmake sure we haven't after:
            (?<!#)      # negative lookbehind, make sure we haven't a # before
            #           # a # and a space
        )           # end lookahead
        .           # any character including newline
    )+          # end group, may appear 1 or more times
"           # end string

如果我理解正确,您试图在每行的开头只捕获一个#符号

帮助您解决此问题的正则表达式是:r"(?:^|\s)(?:[#]\ )(.*\n+##\ ([^#]*\n)+)"。括号用于分隔捕获组或非捕获组。第一个组(?:^|\s)是一个非捕获组,因为它以问号开头。在这里,您希望匹配的字符串以一行或空白开头,然后在第二个组([#]\ )[#]将恰好匹配一个字符\ 匹配哈希和h1标记文本内容之间的空格。最后,您希望匹配任何可能的字符,直到行尾,因此使用特殊字符.,它标识任何字符,后跟将匹配先前匹配字符的任何重复的+

这可能就是您要查找的代码片段,我使用您使用的相同示例测试对其进行了测试

import re

text = """
# My first header

## Nec sic igni ad ad aventi

Lorem markdownum quantumque nunc, fine superi sagittis, haut regalis attollo,
ora inferius, mensor deam? Sedili quoque tauri. Quo limite ducem.

1. Arva fecit partes tosta
2. Insignia est ausae ut ut ait
3. O summa saepe

Sic ipsos, Phlegethontide nisi poterat neque quos tum partes rapitur. Filius
utraque: glande, ut exiles terram fiducia coeunt. Et caelo legit multis,
plangorem altoque; et iamque nec. Sanguine corpora prora quicquid insolida in
Parin: stupet est posses nos mater temptat, gemit num.

# My second header

## Primordia metuam his dixerat talaria cognoscenda

Lorem markdownum revulsum dilexit contra. Qui seu supplex Themis profuit quoque
Hyperionis, omnibus aesculus signa medendi. Aspiciunt rigidique finibus ducunt
postquam, huic postera lignum, properent.

- Nostro purgamina capitque longis
- Virtus suo moenibus
- Byblida longum pudibunda referre
- Via in ab vulneribus petita mirantur quamquam
- Et vela
- Nondum sacer meminisse Dircen novas dumque
"""

r = re.compile(r"r"(?:^|\s)(?:[#]\ )(.*\n+##\ ([^#]*\n)+)"")
print(r.findall(text))

如果您只想提取段落文本,那么可以使用与前一个类似的正则表达式:r"(?:^|\s)(?:[#]\ )(.+)",但它只是从捕获组中删除#符号

相关问题 更多 >