日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构

發(fā)布時(shí)間:2023/11/27 生活经验 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

unutbu..

14

編輯: falsetru的嵌套解析器,我稍微修改為接受任意正則表達(dá)式模式來(lái)指定分隔符和項(xiàng)目分隔符,比我原來(lái)的re.Scanner解決方案更快更簡(jiǎn)單:

import re

def parse_nested(text, left=r'[(]', right=r'[)]', sep=r','):

""" /sf/ask/17360801/ (falsetru) """

pat = r'({}|{}|{})'.format(left, right, sep)

tokens = re.split(pat, text)

stack = [[]]

for x in tokens:

if not x or re.match(sep, x):

continue

if re.match(left, x):

# Nest a new list inside the current list

current = []

stack[-1].append(current)

stack.append(current)

elif re.match(right, x):

stack.pop()

if not stack:

raise ValueError('error: opening bracket is missing')

else:

stack[-1].append(x)

if len(stack) > 1:

print(stack)

raise ValueError('error: closing bracket is missing')

return stack.pop()

text = "a {{c1::group {{c2::containing::HINT}} a few}} {{c3::words}} or three"

print(parse_nested(text, r'\s*{{', r'}}\s*'))

產(chǎn)量

['a', ['c1::group', ['c2::containing::HINT'], 'a few'], ['c3::words'], 'or three']

嵌套結(jié)構(gòu)不能與Python正則表達(dá)式匹配的單獨(dú)的,但它是非常容易建立一個(gè)基本解析器使用(其可以處理嵌套結(jié)構(gòu))re.Scanner:

import re

class Node(list):

def __init__(self, parent=None):

self.parent = parent

class NestedParser(object):

def __init__(self, left='\(', right='\)'):

self.scanner = re.Scanner([

(left, self.left),

(right, self.right),

(r"\s+", None),

(".+?(?=(%s|%s|$))" % (right, left), self.other),

])

self.result = Node()

self.current = self.result

def parse(self, content):

self.scanner.scan(content)

return self.result

def left(self, scanner, token):

new = Node(self.current)

self.current.append(new)

self.current = new

def right(self, scanner, token):

self.current = self.current.parent

def other(self, scanner, token):

self.current.append(token.strip())

它可以像這樣使用:

p = NestedParser()

print(p.parse("((a+b)*(c-d))"))

# [[['a+b'], '*', ['c-d']]]

p = NestedParser()

print(p.parse("( (a ( ( c ) b ) ) ( d ) e )"))

# [[['a', [['c'], 'b']], ['d'], 'e']]

默認(rèn)情況下,NestedParser匹配嵌套括號(hào).您可以傳遞其他正則表達(dá)式以匹配其他嵌套模式,例如括號(hào)[].例如,

p = NestedParser('\[', '\]')

result = (p.parse("Lorem ipsum dolor sit amet [@a xxx yyy [@b xxx yyy [@c xxx yyy]]] lorem ipsum sit amet"))

# ['Lorem ipsum dolor sit amet', ['@a xxx yyy', ['@b xxx yyy', ['@c xxx yyy']]],

# 'lorem ipsum sit amet']

p = NestedParser('', '')

print(p.parse("BARBAZ"))

# [['BAR', ['BAZ']]]

當(dāng)然,pyparsing可以比上面的代碼做得更多.但是對(duì)于這個(gè)單一目的,NestedParser對(duì)于小字符串,上述速度大約快5倍:

In [27]: import pyparsing as pp

In [28]: data = "( (a ( ( c ) b ) ) ( d ) e )"

In [32]: %timeit pp.nestedExpr().parseString(data).asList()

1000 loops, best of 3: 1.09 ms per loop

In [33]: %timeit NestedParser().parse(data)

1000 loops, best of 3: 234 us per loop

大字符串的速度提高約28倍:

In [44]: %timeit pp.nestedExpr().parseString('({})'.format(data*10000)).asList()

1 loops, best of 3: 8.27 s per loop

In [45]: %timeit NestedParser().parse('({})'.format(data*10000))

1 loops, best of 3: 297 ms per loop

總結(jié)

以上是生活随笔為你收集整理的python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。