python 使用命名組合解析結構化文字

2022-09-07 10:54:12 字數 1620 閱讀 4079

有時候我們拿到的資料是以文字的形式逐條列出,而在輸出文字時為了增加可讀性,可能會將資料元素的描述資訊寫入進去,這樣的結構化資料方便人工識別,但是對於資料的二次利用遠不如csv,json等結構化資料好用,為了提取其中有用的資訊,可以使用python正則庫中命名組合的方法來處理。

官方文件裡對命名組合的說明:

(?p…)命名組合)類似正則組合,但是匹配到的子串組在外部是通過定義的 name 來獲取的。組合名必須是有效的python識別符號,並且每個組合名只能用乙個正規表示式定義,只能定義一次。乙個符號組合同樣是乙個數字組合,就像這個組合沒有被命名一樣。

命名組合可以在三種上下文中引用。如果樣式是(?p['"]).*?(?p=quote)(也就是說,匹配單引號或者雙引號括起來的字串):

引用組合"quote"的上下文

引用方法

在正則式自身內

(?p=quote)

\1處理匹配物件 m

m.group('quote')

m.end('quote')`

傳遞到re.sub()裡的 repl 引數中

\g\g<1>

\(?p=name)反向引用乙個命名組合;它匹配前面那個叫 name 的命名組中匹配到的串同樣的字串。

但具體怎麼用呢?文件裡並沒有給出例項,這裡結合乙個具體的例子來說明一下用法:

例如對於下面的結構化字串文字:

student(name="john", age=18, grade=grade(subject="english", mark=90))
如果想要拿到學生的各項資訊,使用字串查詢會非常麻煩,而且不具有通用性,因此考慮使用python中的命名組合方式來提取。首先分析該字串文字的結構,乙個student由三個屬性組成:姓名name, 年齡age,學科成績grade,其中grade屬性本身也是乙個結構化的文字資料,由兩部分組成:學科subject和分數mark。

為了使我們的文字解析正規表示式具有更高的復用性,我們為該條字串定義兩組命名組合student_re和grade_re:

import re

grade_re = r'grade[(]subject="(?p.*)", mark=(?p\d+)[)]'

student_re = r'student[(]name="(?p.*)", age=(?p\d+), grade=[)]'.format(grade=grade_re)

使用上述字串進行測試,提取字串中我們想要的屬性字段資料:

match = re.match(student_re, test_str)

if match:

print(match.group('name'))

print(match.group('subject'))

輸出:

john

english

結果符合我們的需要。因此我們只需要根據字串的結構特徵,將各字段的屬性名稱編寫成正則命名組合,就能對任意形式的結構化字串方便地進行提取了!

Python使用xpath解析帶命名空間的XML

xpath解析xml簡單明瞭,但是xml有命名空間的話就會出錯了。解決方法是節點前加命名空間的字首,下例中x y是變數可以任意定義。例如xml文件如下 text解析 片段 tree etree.parse path root tree.getroot for child in root r chil...

mysql使用命名管道 命名管道

管道是用於相關過程之間的通訊。我們是否可以使用管道進行不相關的程序通訊,比方說,我們要從乙個終端執行客戶端程式,從另乙個終端執行伺服器程式?答案是否定的。那麼怎樣才能實現不相關的程序通訊,簡單的答案就是使用 命名管道。即使這適用於相關的程序,但是使用命名管道進行相關的程序通訊沒有任何意義。我們使用乙...

使用命名空間標準

從背景和主要使用oracle pl sql我已經習慣的想法,布林值 真 假三或空 未知 所以如果宣告反對乙個uninitialsed布林變數將始終返回null 從而只能由 人 沒有任何警告危險。這可能是值得注意的是,對於像我這樣的人,未初始化的布林變數,除了提高警告在編譯和執行時的 突破 在vc20...