Hướng dẫn python regex first word after match - python regex từ đầu tiên sau trận đấu

Tôi đang cố gắng trích xuất một số chuỗi con bằng cách sử dụng regex từ một chuỗi. Tôi có một tham số một từ trong chức năng của mình và mục tiêu là trích xuất từ ​​tiếp theo (định nghĩa của tôi về từ) sau trận đấu này. Tôi đã thử Lookbehind và một số logic khác, nhưng tôi đã không đạt được kết quả để bất kỳ sự giúp đỡ nào được hoan nghênh.

Ví dụ, được đưa ra trường hợp đầu tiên, tôi có đầu vào trong chức năng của mình: **THttpServer**

23:25:04.805: INFO: THttpServer: transportTCPChanged(state: DISCONNECTED 2)
23:25:13.120: INFO: THttpServer: transportUDPOpened(state: Port 54)

Kết quả dự kiến: transportTCPChangedtransportUDPOpened cho cả hai trường hợp.

Một trường hợp khác, tôi có đầu vào currentuserconnectionCurrentUserConnection

23:25:16.622: INFO: CurrentUserConnection#1:RQ : subscribed(userID: 1)
23:25:16.622: INFO: CurrentUserConnection#8:RP : disconnected

Kết quả dự kiến: subscribed, disconnected.

Những điều tôi đã thử (Lookbehind thay đổi tùy thuộc vào ví dụ) trên Notepad ++:

(?<=THttpServer)(\w+): Không phù hợp (?<=THttpServer)(.*): Rõ ràng trả lại tất cả các câu, không mong đợi trận đấu

Tôi hơi bối rối, có lẽ nó thậm chí không thể? Hay tôi cần một số tiền xử lý?

Có một vài cách mà bạn có thể làm điều này, nhưng nó sẽ thực sự phụ thuộc vào hương vị của bạn. Chẳng hạn, phương pháp tôi đang sử dụng dưới đây sẽ không hoạt động trong JavaScript. Nhưng vì chúng tôi không biết bạn đang sử dụng nó như thế nào, tôi sẽ giả sử PCRE.

Những gì tôi sẽ làm chỉ là tìm từ "Không", được bao quanh bởi các ranh giới từ \b để nó không thể là một phần của một từ khác như "Sonogram" và sau đó tìm một dấu chấm tùy chọn

23:25:16.622: INFO: CurrentUserConnection#1:RQ : subscribed(userID: 1)
23:25:16.622: INFO: CurrentUserConnection#8:RP : disconnected
0 và bất kỳ không gian tùy chọn nào
23:25:16.622: INFO: CurrentUserConnection#1:RQ : subscribed(userID: 1)
23:25:16.622: INFO: CurrentUserConnection#8:RP : disconnected
1. Khi bạn đã khớp với điều đó, sau đó sử dụng thiết lập lại trận đấu
23:25:16.622: INFO: CurrentUserConnection#1:RQ : subscribed(userID: 1)
23:25:16.622: INFO: CurrentUserConnection#8:RP : disconnected
2 để bắt đầu kết hợp lại và quên mọi thứ được khớp trước đó. Sau đó, bạn có thể khớp với phần bạn thực sự muốn: các số. Bạn có thể sử dụng
23:25:16.622: INFO: CurrentUserConnection#1:RQ : subscribed(userID: 1)
23:25:16.622: INFO: CurrentUserConnection#8:RP : disconnected
3 để khớp với các chữ số, nhưng tôi đã chọn
23:25:16.622: INFO: CurrentUserConnection#1:RQ : subscribed(userID: 1)
23:25:16.622: INFO: CurrentUserConnection#8:RP : disconnected
4 để khớp các ký tự từ chỉ nghĩ rằng có thể có một số căn hộ trong số này như
23:25:16.622: INFO: CurrentUserConnection#1:RQ : subscribed(userID: 1)
23:25:16.622: INFO: CurrentUserConnection#8:RP : disconnected
5 hoặc một cái gì đó không hoàn toàn là một số. Bạn có thể hạn chế điều này theo ý thích của bạn.

\bno\b    \.?    \s*    \K    \w+

Đây là một bản demo

Hướng dẫn python regex first word after match - python regex từ đầu tiên sau trận đấu

Metacharacter \ B là một mỏ neo như Caret và Dollar Dấu hiệu. Nó phù hợp ở một vị trí được gọi là một từ ranh giới từ của người Viking. Trận đấu này là không có độ dài.\b is an anchor like the caret and the dollar sign. It matches at a position that is called a “word boundary”. This match is zero-length.

Có ba vị trí khác nhau đủ điều kiện là ranh giới từ:

  • Trước ký tự đầu tiên trong chuỗi, nếu ký tự đầu tiên là ký tự từ.
  • Sau ký tự cuối cùng trong chuỗi, nếu ký tự cuối cùng là một ký tự từ.
  • Giữa hai ký tự trong chuỗi, trong đó một ký tự từ và ký tự không phải là ký tự từ.

Nói một cách đơn giản: \ B cho phép bạn thực hiện một từ toàn bộ từ chỉ tìm kiếm bằng cách sử dụng một biểu thức thông thường dưới dạng \ bword \ b. Một nhân vật từ ngữ là một nhân vật có thể được sử dụng để hình thành các từ. Tất cả các nhân vật không phải là các nhân vật từ ngữ của người Viking là những nhân vật không phải là từ.\b allows you to perform a “whole words only” search using a regular expression in the form of \bword\b. A “word character” is a character that can be used to form words. All characters that are not “word characters” are “non-word characters”.

Chính xác thì ký tự là nhân vật phụ thuộc vào hương vị regex mà bạn đang làm việc. Trong hầu hết các hương vị, các ký tự được khớp bởi lớp ký tự ngắn \ w là các ký tự được coi là từ các ký tự bằng ranh giới từ. Java là một ngoại lệ. Java hỗ trợ unicode cho \ b nhưng không phải cho \ w.\w are the characters that are treated as word characters by word boundaries. Java is an exception. Java supports Unicode for \b but not for \w.

Hầu hết các hương vị, ngoại trừ những hương vị được thảo luận dưới đây, chỉ có một metacharacter phù hợp với cả trước một từ và sau một từ. Điều này là do bất kỳ vị trí nào giữa các ký tự không bao giờ có thể là cả khi bắt đầu và cuối của một từ. Chỉ sử dụng một toán tử làm cho mọi thứ dễ dàng hơn cho bạn.

Vì các chữ số được coi là ký tự từ, \ b4 \ b có thể được sử dụng để khớp với 4 không phải là một phần của số lượng lớn hơn. Regex này không khớp với 44 tờ A4. Vì vậy, nói rằng \ b phù hợp với trước và sau một chuỗi chữ và số chính xác hơn là nói trước và sau một từ.\b4\b can be used to match a 4 that is not part of a larger number. This regex does not match 44 sheets of a4. So saying “\b matches before and after an alphanumeric sequence” is more exact than saying “before and after a word”.

\ B là phiên bản phủ định của \ b. \ B phù hợp ở mọi vị trí mà \ b không. Một cách hiệu quả, \ B phù hợp ở bất kỳ vị trí nào giữa hai ký tự từ cũng như tại bất kỳ vị trí nào giữa hai ký tự không từ. is the negated version of \b. \B matches at every position where \b does not. Effectively, \B matches at any position between two word characters as well as at any position between two non-word characters.

Nhìn vào bên trong động cơ Regex

Hãy để xem những gì xảy ra khi chúng ta áp dụng Regex \ bis \ B cho chuỗi Đảo này rất đẹp. Động cơ bắt đầu với mã thông báo đầu tiên \ B ở ký tự đầu tiên T. Vì mã thông báo này có độ dài bằng không, vị trí trước khi ký tự được kiểm tra. \ B phù hợp ở đây, vì t là một ký tự từ và ký tự trước đó là khoảng trống trước khi bắt đầu chuỗi. Động cơ tiếp tục với mã thông báo tiếp theo: theo nghĩa đen i. Động cơ không chuyển sang ký tự tiếp theo trong chuỗi, vì mã thông báo Regex trước đó có độ dài bằng không. Tôi không khớp với T, vì vậy động cơ sẽ thử lại mã thông báo đầu tiên ở vị trí ký tự tiếp theo.\bis\b to the string This island is beautiful. The engine starts with the first token \b at the first character T. Since this token is zero-length, the position before the character is inspected. \b matches here, because the T is a word character and the character before it is the void before the start of the string. The engine continues with the next token: the literal i. The engine does not advance to the next character in the string, because the previous regex token was zero-length. i does not match T, so the engine retries the first token at the next character position.

\ B không thể khớp tại vị trí giữa t và h. Nó không thể khớp giữa H và I, và cả giữa tôi và s. cannot match at the position between the T and the h. It cannot match between the h and the i either, and neither between the i and the s.

Nhân vật tiếp theo trong chuỗi là một không gian. \ B phù hợp ở đây vì không gian không phải là một ký tự từ và ký tự trước đó là. Một lần nữa, động cơ tiếp tục với I không khớp với không gian.\b matches here because the space is not a word character, and the preceding character is. Again, the engine continues with the i which does not match with the space.

Nhấn mạnh một ký tự và khởi động lại với mã thông báo Regex đầu tiên, \ B khớp giữa không gian và thứ hai I trong chuỗi. Tiếp tục, động cơ Regex thấy rằng tôi phù hợp với I và s phù hợp với s. Bây giờ, động cơ cố gắng phù hợp với \ B thứ hai tại vị trí trước L. Điều này thất bại vì vị trí này là giữa hai ký tự từ. Động cơ trở lại khi bắt đầu Regex và tiến lên một nhân vật đến S trên đảo. Một lần nữa, \ B không khớp và tiếp tục làm như vậy cho đến khi đạt được không gian thứ hai. Nó phù hợp ở đó, nhưng phù hợp với tôi thất bại.\b matches between the space and the second i in the string. Continuing, the regex engine finds that i matches i and s matches s. Now, the engine tries to match the second \b at the position before the l. This fails because this position is between two word characters. The engine reverts to the start of the regex and advances one character to the s in island. Again, the \b fails to match and continues to do so until the second space is reached. It matches there, but matching the i fails.

Nhưng \ b khớp với vị trí trước lần thứ ba trong chuỗi. Động cơ tiếp tục và thấy rằng tôi phù hợp với I và S phù hợp s. Mã thông báo cuối cùng trong Regex, \ B, cũng khớp tại vị trí trước không gian thứ ba trong chuỗi vì không gian không phải là ký tự từ và ký tự trước đó.\b matches at the position before the third i in the string. The engine continues, and finds that i matches i and s matches s. The last token in the regex, \b, also matches at the position before the third space in the string because the space is not a word character, and the character before it is.

Động cơ đã phù hợp thành công từ nằm trong chuỗi của chúng tôi, bỏ qua hai lần xuất hiện trước đó của các ký tự I và s. Nếu chúng tôi đã sử dụng biểu thức thông thường là, nó sẽ phù hợp với IS này.is, it would have matched the is in This.

TCL từ ranh giới

Ranh giới từ, như được mô tả ở trên, được hỗ trợ bởi hầu hết các hương vị biểu thức thông thường. Các ngoại lệ đáng chú ý là hương vị lược đồ POSIX và XML, mà không ủng hộ ranh giới từ. TCL sử dụng một cú pháp khác.

Trong TCL, \ B phù hợp với ký tự backspace, giống như \ x08 trong hầu hết các hương vị regex (bao gồm cả TCL,). \ B phù hợp với một ký tự dấu gạch chéo ngược trong tcl, giống như \\ trong tất cả các hương vị regex khác (và TCL cũng vậy).\b matches a backspace character, just like \x08 in most regex flavors (including Tcl’s). \B matches a single backslash character in Tcl, just like \\ in all other regex flavors (and Tcl too).

TCL sử dụng chữ cái của bạn, thay vì chữ cái Biên để phù hợp với ranh giới từ. \ y khớp với bất kỳ vị trí ranh giới từ nào, trong khi \ y khớp ở bất kỳ vị trí nào không phải là ranh giới từ. Các mã thông báo Tcl Regex này phù hợp giống hệt như \ B và \ B trong hương vị regex kiểu Perl. Họ không phân biệt đối xử giữa sự khởi đầu và kết thúc của một từ.\y matches at any word boundary position, while \Y matches at any position that is not a word boundary. These Tcl regex tokens match exactly the same as \b and \B in Perl-style regex flavors. They don’t discriminate between the start and the end of a word.

TCL có thêm hai mã thông báo ranh giới từ thực hiện phân biệt giữa bắt đầu và kết thúc của một từ. \ m chỉ phù hợp khi bắt đầu một từ. Đó là, nó phù hợp ở bất kỳ vị trí nào có ký tự không từ bên trái của nó và một ký tự từ ở bên phải của nó. Nó cũng khớp với đầu chuỗi nếu ký tự đầu tiên trong chuỗi là một ký tự từ. \ M chỉ phù hợp ở cuối một từ. Nó phù hợp ở bất kỳ vị trí nào có ký tự từ bên trái của nó và một ký tự không từ bên phải của nó. Nó cũng khớp với cuối chuỗi nếu ký tự cuối cùng trong chuỗi là một ký tự từ.\m matches only at the start of a word. That is, it matches at any position that has a non-word character to the left of it, and a word character to the right of it. It also matches at the start of the string if the first character in the string is a word character. \M matches only at the end of a word. It matches at any position that has a word character to the left of it, and a non-word character to the right of it. It also matches at the end of the string if the last character in the string is a word character.

Động cơ Regex duy nhất hỗ trợ các ranh giới từ kiểu TCL (ngoài chính TCL) là động cơ JGSoft. Trong PowerGrep và Editpad Pro, \ B và \ B là ranh giới từ theo kiểu perl, trong khi \ y, \ y, \ m và \ m là ranh giới từ theo kiểu tcl.\b and \B are Perl-style word boundaries, while \y, \Y, \m and \M are Tcl-style word boundaries.

Trong hầu hết các tình huống, việc thiếu mã thông báo \ m và \ m không phải là vấn đề. \ yword \ y tìm thấy toàn bộ các từ chỉ xuất hiện của từ ngữ của Word Word giống như \ mword \ m sẽ. \ Mword \ m không bao giờ có thể khớp ở bất cứ đâu, vì \ m không bao giờ khớp ở một vị trí theo sau là một ký tự từ và \ m không bao giờ ở một vị trí trước một. Nếu biểu thức thông thường của bạn cần khớp với các ký tự trước hoặc sau khi \ y, bạn có thể dễ dàng chỉ định trong regex cho dù các ký tự này nên là ký tự từ hoặc ký tự không từ. Nếu bạn muốn khớp với bất kỳ từ nào, \ y \ w+\ y cho kết quả tương tự như \ m.+\ M. Sử dụng \ w thay vì dấu chấm tự động hạn chế \ y đầu tiên để bắt đầu một từ và từ thứ hai đến cuối một từ. Lưu ý rằng \ y.+\ Y sẽ không hoạt động. Regex này phù hợp với từng từ và mỗi chuỗi các ký tự không từ giữa các từ trong chuỗi chủ đề của bạn. Điều đó nói rằng, nếu hương vị của bạn hỗ trợ \ m và \ m, động cơ regex có thể áp dụng \ m \ w+\ m nhanh hơn một chút so với \ y \ w+\ y, tùy thuộc vào tối ưu hóa bên trong của nó.\m and \M tokens is not a problem. \yword\y finds “whole words only” occurrences of “word” just like \mword\M would. \Mword\m could never match anywhere, since \M never matches at a position followed by a word character, and \m never at a position preceded by one. If your regular expression needs to match characters before or after \y, you can easily specify in the regex whether these characters should be word characters or non-word characters. If you want to match any word, \y\w+\y gives the same result as \m.+\M. Using \w instead of the dot automatically restricts the first \y to the start of a word, and the second \y to the end of a word. Note that \y.+\y would not work. This regex matches each word, and also each sequence of non-word characters between the words in your subject string. That said, if your flavor supports \m and \M, the regex engine could apply \m\w+\M slightly faster than \y\w+\y, depending on its internal optimizations.

Nếu hương vị Regex của bạn hỗ trợ Lookahead và Lookbehind, bạn có thể sử dụng (?(?\w)(?=\w) to emulate Tcl’s \m and (?<=\w)(?!\w) to emulate \M. Though quite a bit more verbose, these lookaround constructs match exactly the same as Tcl’s word boundaries.

Nếu hương vị của bạn có vẻ ngoài nhưng không nhìn, và cũng có ranh giới từ theo kiểu perl, bạn có thể sử dụng \ b (? = \ W) để mô phỏng tcl tựa \ m và \ b (?! \ B khớp với đầu hoặc cuối của một từ và LOOKAHEAD kiểm tra xem ký tự tiếp theo có phải là một phần của từ hay không. Nếu đó là chúng tôi khi bắt đầu một từ. Nếu không, chúng tôi ở cuối một từ.\b(?=\w) to emulate Tcl’s \m and \b(?!\w) to emulate \M. \b matches at the start or end of a word, and the lookahead checks if the next character is part of a word or not. If it is we’re at the start of a word. Otherwise, we’re at the end of a word.

Ranh giới từ Gnu

Các tiện ích mở rộng GNU cho các biểu thức chính quy POSIX thêm hỗ trợ cho các ranh giới từ \ b và \ b, như được mô tả ở trên. GNU cũng sử dụng cú pháp riêng cho các ranh giới bắt đầu từ và cuối từ. \ khớp với cuối của một từ, như tcl lề \ m.\b and \B word boundaries, as described above. GNU also uses its own syntax for start-of-word and end-of-word boundaries. \< matches at the start of a word, like Tcl’s \m. \> matches at the end of a word, like Tcl’s \M.

Boost cũng coi \ là ranh giới từ khi sử dụng Ecmascript, mở rộng, EGREP hoặc ngữ pháp AWK.\< and \> as word boundaries when using the ECMAScript, extended, egrep, or awk grammar.

Ranh giới từ Posix

Tiêu chuẩn POSIX định nghĩa [[::]] là một ranh giới cuối từ. Mặc dù cú pháp được mượn từ các biểu thức khung POSIX, các mã thông báo này là các ranh giới từ không liên quan gì và không thể được sử dụng bên trong các lớp ký tự. TCL và GNU cũng hỗ trợ các ranh giới từ POSIX. PCRE hỗ trợ các ranh giới Word Posix bắt đầu với phiên bản 8.34. Boost hỗ trợ họ trong tất cả các ngữ pháp của nó.[[:<:]] as a start-of-word boundary, and [[:>:]] as an end-of-word boundary. Though the syntax is borrowed from POSIX bracket expressions, these tokens are word boundaries that have nothing to do with and cannot be used inside character classes. Tcl and GNU also support POSIX word boundaries. PCRE supports POSIX word boundaries starting with version 8.34. Boost supports them in all its grammars.

\ B có nghĩa là gì trong regex?

Metacharacter \ B là một mỏ neo như Caret và Dollar Dấu hiệu.Nó phù hợp ở một vị trí được gọi là một từ ranh giới từ của người Viking.Trận đấu này là không có độ dài.an anchor like the caret and the dollar sign. It matches at a position that is called a “word boundary”. This match is zero-length.

\ B ranh giới từ là gì?

Boundary từ: \ B từ ranh giới \ B phù hợp với các vị trí trong đó một bên là một ký tự từ (thường là một chữ cái, chữ số hoặc dấu gạch dướicó thể là khởi đầu của chuỗi hoặc một ký tự không gian).matches positions where one side is a word character (usually a letter, digit or underscore—but see below for variations across engines) and the other side is not a word character (for instance, it may be the beginning of the string or a space character).

\ B có nghĩa là gì trong regex python?

Bên trong một phạm vi ký tự, \ B đại diện cho ký tự backspace, để tương thích với các chữ viết của Python.\ B.Khớp với chuỗi trống, nhưng chỉ khi nó không ở đầu hoặc cuối của một từ.backspace character, for compatibility with Python's string literals. \B. Matches the empty string, but only when it is not at the beginning or end of a word.

Một từ trong regex là gì?

Một ký tự từ là một chữ cái, một số hoặc một dấu gạch dưới.Tập hợp các ký tự này cũng có thể được biểu diễn bằng ký tự Regex [A-A-ZA-Z0-9_] \ W \ {1, \}-\ W \ {1,} (xem định lượnga letter, a number, or an underscore. This set of characters may also be represented by the regex character set [a-zA-Z0-9_] \w\{1,\}-\w\{1,} (see quantifiers, below)