簡體   English   中英

字符串與Python中的正則表達式之間的對應關系

[英]Correspondence between strings with regex in Python

我需要Python中的一個函數,該函數需要兩個字符串(a, b)和一個對應規則列表,即成對的字符串(a[i], b[i]) ,並檢查是否可以a分為幾部分,根據對應規則替換每個部分並得到b 問題在於規則可能有點糾結:

  1. 可能會有類似(a, b)(a, c)

  2. (aa, b)(a, c)

  3. (ab, d)(bc, e)

  4. 它是對應關系,而不是替代關系( a不能保留為a或先轉換為b然后轉換為c )。

例如,如果對應規則是(aa, x)(ab, y)(ab, z) ,則不接受(aab, anything)(a, anything) ,但是(aa, x)(abab, yz)(abab, yy)(abab, zz)(abab, zy) ,(aaab,xy)`是。

有沒有一種方法可以使用標准的Python 正則表達式庫或其他一些常見的正則表達式實現來做到這一點? 我可以用蠻力做到這一點,但是要檢查很多對它會非常無效。

(為避免英語完全混亂,我將您的信函對中的元素稱為“鍵”和“值”,即使重復的鍵阻止它們構成典型的dict 。)

我相信有幾個原因使您不能僅使用正則表達式來做到這一點。

問題1. RegExes沒有地圖

正則表達式無法將由某些鍵序列組成的字符串與其轉換成值的方式相關聯。 僅對於初學者而言, re函數需要訪問您的鍵/值對列表,如果這樣做只能告訴您匹配中出現了哪些鍵。

問題2:歧義匹配

正則表達式可以通過多種方式處理歧義匹配,例如:

re.findall(r'(a|aa|aaa)*', 'aaaa')

問題是,對於任何給定的正則表達式,您只能選擇其中之一 您的問題需要跟蹤哪些備選方案匹配,以什么順序進行匹配以及每種方案匹配多少次。

更糟糕的是,您的問題需要知道匹配的那些替代方案的所有可能組合。 但是,一旦正則表達式確定'aaaa'任何重復匹配,例如'a' + 'a' + 'a' + 'a' ,就完成了 -找到匹配。

但是還沒有完成。 您仍然必須測試所有其他匹配項,例如'a' + 'a' + 'aa''a' + 'aa' + 'a'以及'aaa' + 'a'和...這些將導致將值的許多不同組合粘合在一起,並與第二個參數進行比較。 您不能跳過它們。

英勇卻注定的嘗試

我制作了一個正則表達式構建函數,可以識別一組鍵值對的有效輸入和輸出字符串。 不幸的是,這並沒有說明給定的輸入字符串是否可以實際產生特定的輸出。

import re

def is_valid_word(word, alphabet):
    '''
    Returns True if the given word can be assembled from zero or
    more of the strings in the given alphabet.  If word is an
    empty string (''), this is True regardless of strings in the
    alphabet.
    '''
    regex_letters = (re.escape(letter) for letter in alphabet)
    regex_alternatives = '|'.join(regex_letters)
    regex = r'(?:' + regex_alternatives + r')' + r'*' + r'$'
    # regex looks like:  r'(?:a|b|aa|ab|abc)*$'
    pattern = re.compile(regex)
    match = pattern.match(word)
    return match is not None

def is_valid_key_word(word, pairs):
    keys = set(pair[0] for pair in pairs)
    return is_valid_word(word, alphabet=keys)

def is_valid_value_word(word, pairs):
    values = set(pair[1] for pair in pairs)
    return is_valid_word(word, alphabet=values)

這樣可以快速排除所有不可能的輸入或輸出字符串,但實際上並不能解決您的問題,而且如果回溯足夠多,它甚至不會很快。

堅持使用for循環。

暫無
暫無

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

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