Python regex khớp với giá trị khóa

Thông tin được tìm nạp bằng yêu cầu JSONP, yêu cầu này chứa văn bản quảng cáo và liên kết đến hình ảnh quảng cáo. Tệp JSON và hình ảnh được tìm nạp từ buysellads. com hoặc buysellads. net

Nếu bạn có bất kỳ câu hỏi hoặc thắc mắc nào, xin vui lòng gửi email

Mẹo này minh họa một giải pháp sử dụng Qt. Bản thân biểu thức chính quy có thể được sử dụng với bất kỳ công cụ biểu thức chính quy nào tương thích với PERL. Bạn có thể tìm thấy cuộc thảo luận giúp tôi viết Mẹo này tại Diễn đàn RegEx

Giới thiệu

Bạn nói, phân tích một cặp Khóa-Giá trị không khó lắm sao?

Key1=Value1 Key2=Value2

Nhưng nếu chúng ta tiến lên một chút thì sao?

Key1=Value 1 Key2=Value Key3=Value 3

Chúng tôi đến một nơi nào đó, như bạn có thể thấy. Nhưng tôi muốn nhiều hơn. Tôi muốn giá trị có thể chứa mọi thứ. Tất nhiên, điều này dẫn chúng ta đến một vấn đề, bởi vì '=' đã được dành riêng làm dấu phân cách giữa Khóa và Giá trị - Có thể giải quyết được bằng cách thoát dấu '=' nếu nó xảy ra trong một giá trị. Tôi đã tạo ra ví dụ thực tế này khi mẫu này có thể được sử dụng

ErrorMessage=The file was not found. Path\=C:/Temp/File.txt ErrorNumber=12312

Sử dụng biểu thức chính quy

Giải pháp được trình bày ở đây là khả thi trong mọi công cụ biểu thức chính quy tương thích với PERL, mặc dù tôi sẽ sử dụng Qt để chứng minh việc sử dụng nó. Regex trông khá mất tập trung nếu bạn nhìn vào nó lần đầu tiên

^((\b[^\s=]+)=(([^=]|\\=)+))*$

Thoạt nhìn regex có vẻ lạ, nhưng ngay sau khi bạn đặt nó vào Expresso, bạn có thể thấy ý nghĩa của nó rõ ràng hơn

Về cơ bản, regex chứa hai nhóm chụp khác nhau, một nhóm là khóa ((\b[^\s=]+)) và nhóm còn lại là giá trị ((([^=]. \\=)+)). Hai lần chụp này phải được phân tách bằng dấu '='. Một khóa có thể chứa bất kỳ thứ gì ngoại trừ khoảng trắng hoặc '=' và một giá trị có thể chứa bất kỳ thứ gì ngoại trừ '=' không thoát. Mỗi chuỗi có thể xảy ra với bất kỳ số lần lặp lại nào

Bây giờ bạn đã biết về cơ bản regex làm gì, bạn cũng cần có khả năng phân tích cú pháp một chuỗi bằng cách sử dụng regex đã mô tả trước đó. Một cái gì đó quan trọng cũng vẫn còn để nói. Biểu thức chính quy được đề xuất chỉ trả về cặp Khóa-Giá trị cuối cùng, do đó chúng tôi cần xử lý chuỗi đầu vào nhiều lần

//Regular expression as descripted at 
// http://www.codeproject.com/Tips752372/Parsing-a-Key-Value-pair-with-a-Regular-Expression
QRegularExpression regex("^((\\b[^\\s=]+)=(([^=]|\\\\=)+))*$");
QString example = "ErrorMessage=File wasn't found_Path\=C:/Temp/File.txt ErrorNumber=12312";
while(example.length() > 0){//As long there is stuff in example
   //Get the last Key-Value pair from the RegEx
   QRegularExpressionMatch keyValueRegexMatch = keyValueRegex.match(keyValueRawData); 

   //Output the found Key-Value Pair
   qDebug()<<"Key="<2);
   qDebug()<<"Value="<3);

   //Remove the replaced Key-Value pair from the input
   example = example.replace(keyValueRegexMatch.captured(1), "");
}

Giải pháp trên không phải là hoàn hảo, nhưng nó cần một số điều chỉnh. Nếu một nhóm đã chụp không ở cuối chuỗi, thì khoảng cách giữa Giá trị và khóa sau sẽ không bị xóa

Điểm quan tâm

Thật thú vị khi các biểu thức chính quy mạnh mẽ như thế nào. Nhưng ví dụ này cũng cho tôi thấy rằng không phải tất cả các công cụ biểu thức chính quy đều hoạt động theo cùng một cách và đôi khi bạn cần chỉnh sửa một biểu thức chính quy để nó hoạt động trên một công cụ cụ thể, mặc dù nó đã hoạt động hoàn hảo với một công cụ khác. Tôi đã thử nghiệm biểu thức chính quy này với công cụ biểu thức chính quy Qt (chính xác là QRegularExpression - Xem tại đây để biết sự khác biệt với QRegExp) và. Net, nhưng tôi tự tin rằng nó sẽ hoạt động tốt với hầu hết các công cụ regex phổ biến hiện có

Giấy phép

Bài viết này, cùng với bất kỳ mã nguồn và tệp liên quan nào, được cấp phép theo Giấy phép Mở Dự án Mã (CPOL)

Làm cách nào tôi có thể truy cập giá trị của khóa bằng Regex trong Python? . Thanks

Những gì tôi đã thử

Tôi đã thử những cách không liên quan đến câu hỏi và tôi hiểu rằng mình nên sử dụng cách này


Tôi sẽ sử dụng hỗ trợ JSON tích hợp, nó linh hoạt hơn nhiều

Nhưng mà. nếu bạn phải sử dụng Regex, bạn có thể thử

(?<=\"THE_KEY\"\s*:\s*\").+?(?=\")

Nếu bạn định chơi với các biểu thức chính quy, thì hãy lấy một bản sao của Expresso[^] - nó miễn phí và nó sẽ kiểm tra và tạo Regexes

Thêm giải pháp của bạn ở đây

 B   I   U   S  small BIG code var  <   >   &  link [^] encode untab case indent outdent

Xem trước 0

thành viên hiện có

hoặc tham gia với chúng tôi

Tải xuống, Bình chọn, Nhận xét, Xuất bản

Email của bạn

Email này đang được sử dụng. Bạn có cần mật khẩu của bạn?

Mật khẩu tùy chọn

Khi trả lời một câu hỏi xin vui lòng

  1. Đọc kỹ câu hỏi
  2. Hiểu rằng tiếng Anh không phải là ngôn ngữ đầu tiên của mọi người, vì vậy hãy khoan dung với lỗi chính tả và ngữ pháp
  3. Nếu một câu hỏi được diễn đạt kém thì hãy yêu cầu làm rõ, bỏ qua nó hoặc chỉnh sửa câu hỏi và khắc phục sự cố. Xúc phạm không được chào đón
  4. Đừng bảo ai đó đọc hướng dẫn. Rất có thể họ có và không nhận được. Đưa ra câu trả lời hoặc chuyển sang câu hỏi tiếp theo
Hãy làm việc để giúp các nhà phát triển, không làm họ cảm thấy ngu ngốc


Nội dung này, cùng với bất kỳ tệp và mã nguồn liên quan nào, được cấp phép theo Giấy phép Mở Dự án Code (CPOL)