我想處理一個字符串與CHAR(INT)和NCHAR(INT)來轉換這些實例與他們的ASCII計數器部分。一個例子是這樣的:只有Python的正則表達式從嵌套組中選擇/提取
CHAR(124) + (SELECT TOP 1 CAST(name AS VARCHAR(8000)) FROM (SELECT TOP 1 colid, name FROM [Projects]..[syscolumns]
WHERE xtype=char(85)
AND id = OBJECT_ID(NCHAR(69)+NCHAR(78)+NCHAR(95)+NCHAR(69)+NCHAR(109)+NCHAR(112)+NCHAR(108))
注意,我不想做任何VARCHAR(INT),只是到CHAR(int)和NCHAR(INT)部分。以上應該轉換爲:
|(SELECT TOP 1 CAST(name AS VARCHAR(8000))FROM(SELECT TOP 1 colid,name FROM [Projects] .. [syscolumns] WHERE xtype = U AND id = OBJECT_ID EN_Empl)
注意,任何 「+」 上CHAR(INT)或NCHAR(INT)的任一側應被刪除我嘗試以下:
def conv(m):
return chr(int(m.group(2)))
print re.sub(r'([\+ ]?n?char\((.*?)\)[\+ ]?)', conv, str, re.IGNORECASE)
其中str
=原始字符串必須
不知何故,VARCHAR(8000)正在拾取。如果我調整了reg ex,xtype消失後的「=」,而不僅僅是CHAR(int)或NCHAR(int)實例兩側的空格和「+」。
希望有人能把我拉出來。
補充樣品STRINGS:
字符串"char(124)+(Select Top 1 cast(name as varchar(8000)) from (Select Top 1 colid,name From [Projects]..[syscolumns] Where id = OBJECT_ID(NCHAR(69)+NCHAR(78)+NCHAR(95)+NCHAR(69)+NCHAR(109)+NCHAR(112)+NCHAR(108)))"
正則表達式:r'(\bn?char\((\d+)\)(?:\s*\+\s*)?)'
結果:"|(Select Top 1 cast(name as varchar(8000)) from (Select Top 1 colid,name From [Projects]..[syscolumns] Where id = OBJECT_ID(ENCHAR(78)+NCHAR(95)+NCHAR(69)+NCHAR(109)+NCHAR(112)+NCHAR(108)))"
謝謝@Tim Peters。讚賞提高可讀性的建議;它也能幫助我(別說別人了!)。我確實嘗試過,它似乎工作!有一件事我不明白分組+搜索+替換正則表達式中的作品。我最初在另一個組中創建了一個組(對於要轉換爲其ASCII等效值的組)(封裝了[+]和[N] CHAR(int)實例的空白)。您的正則表達式會刪除任何周圍的「+」或空白字符,即使它不是該組的一部分。我必須花更多時間用正則表達式的基礎。謝謝你的幫助! –
不客氣:-)'sub()'替換了正則表達式匹配的整個子字符串,所以實際上並不需要最外層的組。這就是我刪除它的原因。儘管如此,我們仍然需要一個組來隔離數字,以便'conv()'可以輕鬆找到它們。但是'conv()'的輸出替換了正則表達式匹配的*整個*子字符串。也許有點微妙,但你會很快適應它;-) –
感謝@蒂姆彼得斯非常有幫助的解釋和答案! –