簡體   English   中英

Python 的 regex.match() function 與多行字符串不一致

[英]Python's regex .match() function works inconsistently with multiline strings

我正在 python 中編寫一個腳本,該腳本采用包含 markdown 文件形式的日記條目的目錄並處理每個文件,以便從中創建 object。 這些對象被附加到日記帳分錄對象列表中。 object 包含 3 個字段:標題、日期和正文。

為了創建這個條目對象列表,我遍歷目錄中的每個文件,並將 append 循環到列表中,返回名為entry_create_object的 function 的返回值,它將文件文本作為輸入。

def load_entries(directory):
    entries = []

    for filename in os.listdir(directory):
        filepath = os.path.join(directory, filename) 

        with open(filepath, 'r') as f:
            text = f.read()
            entry_object = entry_create_object(text)
            if entry_object: entries.append(entry_object)
            else: print(f"Couldn't read {filepath}")
    return entries 

為了創建 object,我使用正則表達式來查找標題和日期字段所需的信息。 正文只是文件內容。 如果 function 與標題和日期不匹配,則返回 None。 以下代碼是我使用的:

def entry_create_object(ugly_entry):

    title = re.match('^# (.*)', ugly_entry)
    date = re.match('(Date:|Created at:) (\w{3}) (\d{2}), (\d{4})', ugly_entry)
    body = ugly_entry
    if not (title and date and body):
        return

    entry_object = {}
    entry_object['title'], entry_object['date'], entry_object['body'] = title, date, body

    return entry_object

出於某種原因,我無法理解,我的日期正則表達式適用於某些文件,但不適用於其他文件,即使我已經能夠通過在在線正則表達式 webapp 中測試我的正則表達式模式成功匹配我想要的內容,例如作為正則表達式。 標題正則表達式模式適用於所有文件。

我在測試中發現re.match總體上與多行字符串非常不一致,但我一直無法找到修復它的方法。

我看不出我的模式有什么問題。

成功匹配標題和日期的文件示例:

# Time tracker

Created at: Oct 21, 2020 4:16 PM
Date: Oct 21, 2020

[...]

與日期不匹配的文件示例:

# Bad habits

Created at: Dec 6, 2020 4:24 PM
Date: Dec 6, 2020

[...]

感謝您的時間。

讓我們解碼正則表達式。

    date = re.match('(Date:|Created at:) (\w{3}) (\d{2}), (\d{4})', ugly_entry)

那是三個字母,后跟一個空格,然后是 2 位數字,然后是逗號空格,然后是 4 位數字。 鑒於該描述,您能明白為什么以下字符串不匹配嗎?

Created at: Dec 6, 2020 4:24 PM

我不應該破壞這個驚喜,但你想要(\d{1,2}),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM