簡體   English   中英

正則表達式,用於將字符串與子字符串匹配

[英]Regex for matching a string with substrings

我正在尋找正則表達式解決方案以替換給定動態模式的子字符串。 問題在於子字符串可能包含一個已知令牌,而我們不知道該令牌出現在哪個位置。 我可以將問題表達為:即使(已知)令牌發生沖突,也要替換字符串中的(給定)模式。

假設我們有my_string

我喜歡綠色, 藍豆!

PLUS代表已知令牌,如果它妨礙比賽,我們想忽略它。

我們還有一個名為my_pattern的變量模式,它可以是my_string之外的任何部分,除了PLUS以外,例如:

1)綠色和藍色

2)青豆和青豆

3)我喜歡綠色

我們知道PLUS可能出現在my_string中的某個位置 ,我們不知道位置。 從理論上講, my_string也可以是:

我喜歡PLUS綠,藍豆!

由於my_pattern可能以1),2)或3)的形式出現,因此我們也無法使用OR對該解決方案進行硬編碼。

尋求的解決方案類似於: my_string .replace( my_pattern ,“ red”),其輸出為my_pattern:

1)我喜歡紅豆!

2)我喜歡紅色!

3)紅藍豆!

盡管PLUS出現在my_string中 (這可能與my_pattern沖突),但my_pattern應該匹配。 類似於:匹配my_pattern,並在影響匹配的情況下忽略PLUS

如果您的令牌是一個帶有空格的單詞,那么這個粗魯的功能可以工作:

import re

def skip_token(s, pattern, token, sub):
    p = pattern.split()
    gex = "|".join([pattern] + [" ".join(p[:i] + [token] + p[i:]) for i in range(1, len(p))])
    return re.sub(gex, sub, s)

s = "I like green and PLUS blue beans!"
token = "PLUS"
sub = "red"


>>> print(skip_token(s, "green and blue", token, sub))
>>> print(skip_token(s, "green and blue beans", token, sub))
>>> print(skip_token(s, "I like green", token, sub))

I like red beans!
I like red!
red and PLUS blue beans!

但是,如果您的my_string具有標點符號,並且在任何地方都可以找到令牌,則有時會失敗。

您可以修改模式,以便在每個單個字符之間添加令牌的正則表達式。
您沒有明確解釋的是,令牌還在字符串中添加了一個空格,因此令牌正則表達式也應在左右兩側查找空格。

import re
token = 'PLUS'
patterns = ['green and blue', 'green and blue beans', 'I like green']

ptn_pls = [f'( ?{token} ?)?'.join(p) for p in patterns]

應用於三個不同的字符串:

my_string = 'I like green and PLUS blue beans!'
for p in ptn_pls:
    print(re.sub(p, 'red', my_string))
# I like red beans!
# I like red!                                                 
# red and PLUS blue beans!

my_string = 'I PLUS like green and blue beans!'
for p in ptn_pls:
    print(re.sub(p, 'red', my_string))
# I PLUS like red beans!                                      
# I PLUS like red!                                            
# red and blue beans!  

my_string = 'I like grPLUSeen a PLUSnd blue beans!'
for p in ptn_pls:
    print(re.sub(p, 'red', my_string))
# I like red beans!                                          
# I like red!                                                 
# red a PLUSnd blue beans!     

暫無
暫無

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

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