簡體   English   中英

在Python中使用正則表達式匹配C ++字符串和字符串文字

[英]Match C++ Strings and String Literals using regex in Python

我試圖在C ++源文件中匹配字符串 (在雙引號和單引號之間)和字符串文字 我在Python中使用re庫。

我已達到可以匹配雙引號與r'"(.*?)"'但是在擴展上述正則表達式的語法方面遇到問題也與單引號字符串匹配(與\\混淆以及如何逃避引用Python正則表達式)。

此外,從這里我希望能夠匹配以下每種情況:

  • “(unescaped_character | escaped_character)*”

  • L“(unescaped_character | escaped_character)*”

  • u8“(unescaped_character | escaped_character)*”

  • 你“(unescaped_character | escaped_character)*”

  • U“(unescaped_character | escaped_character)*”

  • 前綴(可選)R“分隔符(raw_characters)分隔符”

我對正則表達式很困惑,所有我嘗試失敗。 任何建議和示例代碼對我來說都很棒,以獲得理解並且 - 構建所有這些正則表達式。

您可以使用以下正則表達式獲取所有字符串文字:

r'(?P<prefix>(?:\bu8|\b[LuU])?)(?:"(?P<dbl>[^"\\]*(?:\\.[^"\\]*)*)"|\'(?P<sngl>[^\'\\]*(?:\\.[^\'\\]*)*)\')|R"([^"(]*)\((?P<raw>.*?)\)\4"'

請參閱正則表達式演示

說明

  • (?P<prefix>(?:\\bu8|\\b[LuU])?) - (組名為“prefix”)可選前綴, u8 (整個單詞)或LuU (作為整個單詞)
  • (?:"(?P<dbl>[^"\\\\]*(?:\\\\.[^"\\\\\\\\]*)*)" - 雙引號字符串文字,內容介於"捕獲到名為“DBL”基團。該部分匹配"以外,則0+字符\\"隨后用轉義序列的序列中的任何數(0+)( \\\\.接着用比其它0+字符\\" (它是(?:[^"\\\\]|\\\\.)*的展開版本(?:[^"\\\\]|\\\\.)*
  • | - 要么
  • \\'(?P<sngl>[^\\'\\\\]*(?:\\\\.[^\\'\\\\]*)*)\\') - 單引號字符串文字,內容介於'捕獲到組名為“sngl”。 詳細了解它的工作原理。
  • | - 要么
  • R"([^"(]*)\\((?P<raw>.*?)\\)\\4" - 這是一個原始字符串文字部分,將內容捕獲到名為raw的組中。首先, R匹配。然后"跟着0 +以外的字符"(同時將分隔符值捕獲到第4組(因為所有命名的組也有它們的數字ID),然后內部的re.S與惰性構造匹配(如果是字符串是多行的,直到第一個)接着是第4組的內容(原始字符串文字分隔符),然后是最后的"

示例Python演示

import re

p = re.compile(r'(?P<prefix>(?:\bu8|\b[LuU])?)(?:"(?P<dbl>[^"\\]*(?:\\.[^"\\]*)*)"|\'(?P<sngl>[^\'\\]*(?:\\.[^\'\\]*)*)\')|R"([^"(]*)\((?P<raw>.*?)\)\4"')
s = "\"text'\\\"here\"\nL'text\\'\"here'\nu8\"text'\\\"here\"\nu'text\\'\"here'\nU\"text'\\\"here\"\nR\"delimiter(text\"'\"here)delimiter\""
print(s)
print('--------- Regex works below ---------')
for x in p.finditer(s):
    if x.group("dbl"):
        print(x.group("dbl"))
    elif x.group("sngl"):
        print(x.group("sngl"))
    else:
        print(x.group("raw"))

暫無
暫無

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

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