Hướng dẫn python regex get all groups - python regex nhận tất cả các nhóm

Tôi bối rối vì điều này:

>>> import re
>>> re.match(r"(?P-(?P\w+))*","-ab-cde-fghi-jkl-mn").groups()
('-mn', 'mn')
>>> re.match(r"(?P-(?P\w+)*)","-ab-cde-fghi-jkl-mn").groups()
('-ab', 'ab')

Làm thế nào để tôi có được danh sách tất cả các điều khoản, lý tưởng là như

["ab","cde","fghi","jkl","mn"]

nhưng

"-ab-cde-fghi-jkl-mn"

cũng tốt.

.

Hỏi ngày 20 tháng 10 năm 2016 lúc 14:40Oct 20, 2016 at 14:40

Hướng dẫn python regex get all groups - python regex nhận tất cả các nhóm

2

Với

["ab","cde","fghi","jkl","mn"]
4

Example:

s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)

Output:

['ab', 'cde', 'fghi', 'jkl', 'mn']

Hướng dẫn python regex get all groups - python regex nhận tất cả các nhóm

Nhà vật lý điên

102K25 Huy hiệu vàng169 Huy hiệu bạc251 Huy hiệu Đồng25 gold badges169 silver badges251 bronze badges

Đã trả lời ngày 20 tháng 10 năm 2016 lúc 14:44Oct 20, 2016 at 14:44

dgg32dgg32dgg32

1.3591 Huy hiệu vàng12 Huy hiệu bạc32 Huy hiệu đồng1 gold badge12 silver badges32 bronze badges

Nó hoạt động như bạn muốn theo mặc định trong .NET.

Python không hỗ trợ điều này mặc dù. Hành vi gần nhất mà bạn có thể nhận được trong Python, sẽ là lặp lại trận đấu trên chuỗi con bị bắt:

>>> match = re.match(r"(?P(?:-(?P\w+))*)","-ab-cde-fghi-jkl-mn")
>>> re.findall(r"-(?P\w+)", match.group("all"))
['ab', 'cde', 'fghi', 'jkl', 'mn']

Nó có thể trở nên phức tạp nếu mẫu bên trong không cực kỳ đơn giản.

Đã trả lời ngày 20 tháng 10 năm 2016 lúc 14:51Oct 20, 2016 at 14:51

Markus Jarderotmarkus JarderotMarkus Jarderot

84,9K20 Huy hiệu vàng135 Huy hiệu bạc137 Huy hiệu đồng20 gold badges135 silver badges137 bronze badges

Trong bài viết này, sẽ học cách bắt các nhóm Regex trong Python. Bằng cách bắt các nhóm, chúng ta có thể khớp một số mẫu riêng biệt bên trong cùng một chuỗi mục tiêu.match several distinct patterns inside the same target string.

Nhóm ở Regex là gì?

Một nhóm là một phần của mô hình regex được đặt trong ngoặc đơn

["ab","cde","fghi","jkl","mn"]
5 metacharacter. Chúng tôi tạo một nhóm bằng cách đặt mẫu regex bên trong tập hợp các dấu ngoặc đơn ____ ____ 16 & nbsp; và & nbsp; ________ 17 & nbsp ;. Ví dụ, biểu thức thông thường
["ab","cde","fghi","jkl","mn"]
8 tạo ra một nhóm duy nhất chứa các chữ cái ‘C,’ A, và ’t.
. We create a group by placing the regex pattern inside the set of parentheses
["ab","cde","fghi","jkl","mn"]
6 and 
["ab","cde","fghi","jkl","mn"]
7 . For example, the regular expression
["ab","cde","fghi","jkl","mn"]
8 creates a single group containing the letters ‘c’, ‘a’, and ‘t’.

Ví dụ: trong trường hợp trong thế giới thực, bạn muốn ghi lại email và số điện thoại, vì vậy bạn nên viết hai nhóm, nhóm đầu tiên sẽ tìm kiếm email và số thứ hai sẽ tìm kiếm số điện thoại.

Ngoài ra, các nhóm bắt giữ là một cách để coi nhiều ký tự như một đơn vị. Chúng được tạo bằng cách đặt các ký tự được nhóm bên trong một tập hợp dấu ngoặc đơn

["ab","cde","fghi","jkl","mn"]
6,
["ab","cde","fghi","jkl","mn"]
7.

Ví dụ, trong biểu thức,

"-ab-cde-fghi-jkl-mn"
1, có ba nhóm như vậy

  1. "-ab-cde-fghi-jkl-mn"
    
    1
  2. "-ab-cde-fghi-jkl-mn"
    
    3
  3. "-ab-cde-fghi-jkl-mn"
    
    4

Chúng tôi có thể chỉ định nhiều nhóm như chúng tôi muốn. Mỗi mẫu phụ bên trong một cặp dấu ngoặc đơn sẽ được chụp dưới dạng một nhóm. Các nhóm bắt giữ được đánh số bằng cách đếm dấu ngoặc đơn của họ từ trái sang phải.

Các nhóm chụp là một tính năng tiện dụng của khớp biểu thức chính quy cho phép chúng tôi truy vấn đối tượng khớp để tìm ra một phần của chuỗi phù hợp với một phần cụ thể của biểu thức thông thường.

Bất cứ điều gì bạn có trong ngoặc đơn

["ab","cde","fghi","jkl","mn"]
5 sẽ là một nhóm bắt giữ. Sử dụng phương thức
"-ab-cde-fghi-jkl-mn"
6 của đối tượng Kết hợp Regex, chúng ta có thể trích xuất giá trị phù hợp của mỗi nhóm.

Chúng ta sẽ thấy cách chụp đơn cũng như nhiều nhóm.

Ví dụ để bắt nhiều nhóm

Hãy giả sử bạn có chuỗi sau:

target_string = "The price of PINEAPPLE ice cream is 20"

Và, bạn muốn khớp với hai nhóm regex sau đây trong một chuỗi

  1. Để phù hợp với một từ viết hoa
  2. Để phù hợp với một số

Để trích xuất từ ​​chữ hoa và số từ chuỗi đích, trước tiên chúng ta phải viết hai mẫu biểu thức chính quy.

  1. Mẫu để khớp từ chữ hoa (dứa)PINEAPPLE)
  2. Mẫu để khớp với số (20).20).

Mẫu nhóm đầu tiên tìm kiếm từ chữ hoa:

"-ab-cde-fghi-jkl-mn"
7
"-ab-cde-fghi-jkl-mn"
7

  • "-ab-cde-fghi-jkl-mn"
    
    8 là lớp ký tự. Nó có nghĩa là phù hợp với bất kỳ chữ cái nào từ thủ đô A đến vốn Z bằng chữ hoa độc quyền.
  • Sau đó,
    "-ab-cde-fghi-jkl-mn"
    
    9 metacharacter cho biết 1 hoặc nhiều hơn sự xuất hiện của một chữ cái viết hoa

Mô hình nhóm thứ hai để tìm kiếm giá:

s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
0
s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
0

  • & Nbsp; ________ 31 có nghĩa là khớp bất kỳ chữ số nào từ 0 đến 9 trong chuỗi đích
  • Sau đó, Metacharacter
    "-ab-cde-fghi-jkl-mn"
    
    9 cho biết số lượng có thể chứa tối thiểu 1 hoặc tối đa bất kỳ số chữ số nào.

Trích xuất các giá trị nhóm phù hợp

Cuối cùng, chúng ta có thể sử dụng phương thức đối tượng nhóm () và nhóm () của đối tượng để có được các giá trị phù hợp.

Bây giờ, hãy để Lôi di chuyển đến ví dụ.

Thí dụ

import re

target_string = "The price of PINEAPPLE ice cream is 20"

# two groups enclosed in separate ( and ) bracket
result = re.search(r"(\b[A-Z]+\b).+(\b\d+)", target_string)

# Extract matching values of all groups
print(result.groups())
# Output ('PINEAPPLE', '20')

# Extract match value of group 1
print(result.group(1))
# Output 'PINEAPPLE'

# Extract match value of group 2
print(result.group(2))
# Output 20

Hãy để hiểu ví dụ trên

Trước hết, tôi đã sử dụng A & NBSP; Chuỗi thô để chỉ định mẫu biểu thức chính quy. Như bạn có thể đã biết, dấu gạch chéo ngược có ý nghĩa đặc biệt trong một số trường hợp vì nó có thể chỉ ra một ký tự thoát hoặc trình tự thoát để tránh rằng chúng ta phải sử dụng chuỗi RAW.raw string to specify the regular expression pattern. As you may already know, the backslash has a special meaning in some cases because it may indicate an escape character or escape sequence to avoid that we must use raw string.

Bây giờ, hãy để một cái nhìn kỹ hơn về cú pháp biểu thức thông thường để xác định và cô lập hai mẫu mà chúng ta đang tìm kiếm để phù hợp. Chúng tôi cần hai điều.

Đầu tiên, chúng ta cần gửi kèm theo hai trong hai mẫu bên trong một cặp dấu ngoặc đơn. Vì vậy,

s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
3 là nhóm đầu tiên và
s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
4 là nhóm thứ hai ở giữa các dấu ngoặc đơn. Do đó, mỗi cặp dấu ngoặc đơn là một nhóm.
s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
3
is the first group, and
s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
4
is the second group in between parentheses. Therefore each pair of parentheses is a group.

Note::

  • Các dấu ngoặc đơn không phải là một phần của mẫu. Nó chỉ ra một nhóm.
  • s = "-ab-cde-fghi-jkl-mn"
    re.findall(r'[a-z]+', s)
    
    5 chỉ ra một ranh giới từ.

Thứ hai, chúng ta cần xem xét bối cảnh lớn hơn trong đó các nhóm này cư trú. Điều này có nghĩa là chúng tôi cũng quan tâm đến vị trí của từng nhóm này bên trong toàn bộ chuỗi mục tiêu và đó là lý do tại sao chúng tôi cần cung cấp bối cảnh hoặc đường viền cho mỗi nhóm.

Tiếp theo, tôi đã thêm

s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
6 khi bắt đầu mỗi nhóm. DOT đại diện cho bất kỳ ký tự nào ngoại trừ một dòng mới và dấu cộng có nghĩa là mẫu trước đang lặp lại một hoặc nhiều lần. Cú pháp này có nghĩa là trước nhóm, chúng ta có một loạt các ký tự mà chúng ta có thể bỏ qua, chỉ lấy các từ chữ hoa theo sau là ranh giới từ (khoảng trắng). Nó sẽ phù hợp với dứa.
s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
6
at the start of each group. the dot represents any character except a new line and the plus sign means that the preceding pattern is repeating one or more times. This syntax means that before the group, we have a bunch of characters that we can ignore, only take uppercase words followed by the word boundary (whitespace). it will match to PINEAPPLE.

Tôi cũng đã thêm

s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
6 khi bắt đầu mẫu thứ hai, điều đó có nghĩa là trước nhóm thứ hai, chúng tôi có một loạt các ký tự mà chúng tôi có thể bỏ qua, chỉ lấy các số theo sau là một ranh giới. Nó sẽ phù hợp với 20.

Tiếp theo, chúng tôi đã chuyển cả hai mẫu cho phương thức

s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
8 để tìm trận đấu.

Phương thức nhóm ()s() method

Cuối cùng, sử dụng phương thức nhóm () của một đối tượng khớp, chúng ta có thể trích xuất tất cả các kết quả phù hợp nhóm cùng một lúc. Nó cung cấp tất cả các trận đấu trong định dạng tuple.

Truy cập từng kết quả nhóm một cách riêng biệt

Chúng ta có thể sử dụng phương thức nhóm () để trích xuất từng kết quả nhóm bằng cách chỉ định một chỉ mục nhóm ở giữa các dấu ngoặc đơn. Các nhóm bắt giữ được đánh số bằng cách đếm dấu ngoặc đơn của họ từ trái sang phải. Trong trường hợp của chúng tôi, chúng tôi đã sử dụng hai nhóm.

Xin lưu ý rằng không giống như lập chỉ mục chuỗi, luôn bắt đầu từ 0, đánh số nhóm luôn bắt đầu ở mức 1.group numbering always starts at 1.

Nhóm có số 0 luôn là chuỗi đích. Nếu bạn gọi phương thức

s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)
9 không có đối số nào cả hoặc với 0 làm đối số, bạn sẽ nhận được toàn bộ chuỗi mục tiêu.

Để có quyền truy cập vào văn bản phù hợp với mỗi nhóm Regex, hãy chuyển số nhóm nhóm sang phương thức

"-ab-cde-fghi-jkl-mn"
6.

Vì vậy, nhóm đầu tiên sẽ là một nhóm 1. Nhóm thứ hai sẽ là một nhóm gồm 2 người, v.v.

Thí dụ

# Extract first group
print(result.group(1))

# Extract second group
print(result.group(2))

# Target string
print(result.group(0))

Vì vậy, đây là cách đơn giản để truy cập vào từng nhóm miễn là các mẫu được khớp.

Nhóm chụp Regex nhiều lần

Trong các ví dụ trước, chúng tôi đã sử dụng phương pháp tìm kiếm. Nó sẽ chỉ trả lại trận đấu đầu tiên cho mỗi nhóm. Nhưng điều gì sẽ xảy ra nếu một chuỗi chứa nhiều lần xuất hiện của một nhóm Regex và bạn muốn trích xuất tất cả các trận đấu.

Trong phần này, chúng tôi sẽ học cách ghi lại tất cả các trận đấu với một nhóm Regex. Để nắm bắt tất cả các kết quả phù hợp với một nhóm regex, chúng ta cần sử dụng phương thức findIter ().

Phương thức findIter () tìm thấy tất cả các kết quả phù hợp và trả về một iterator mang lại các đối tượng khớp khớp với mẫu regex. Tiếp theo, chúng ta có thể lặp lại từng đối tượng khớp và trích xuất giá trị của nó.

Lưu ý: Don Tiết sử dụng phương thức findall () vì nó trả về một danh sách, phương thức nhóm () không thể được áp dụng. Nếu bạn cố gắng áp dụng nó vào phương thức Findall, bạn sẽ nhận được AttributionError: ‘Danh sách đối tượng không có thuộc tính‘ Nhóm.: Don’t use the findall() method because it returns a list, the group() method cannot be applied. If you try to apply it to the findall method, you will get AttributeError: ‘list’ object has no attribute ‘groups.’

Vì vậy, hãy luôn sử dụng Finditer nếu bạn muốn ghi lại tất cả các trận đấu với nhóm.

Thí dụ

import re

target_string = "The price of ice-creams PINEAPPLE 20 MANGO 30 CHOCOLATE 40"

# two groups enclosed in separate ( and ) bracket
# group 1: find all uppercase letter
# group 2: find all numbers
# you can compile a pattern or directly pass to the finditer() method
pattern = re.compile(r"(\b[A-Z]+\b).(\b\d+\b)")

# find all matches to groups
for match in pattern.finditer(target_string):
    # extract words
    print(match.group(1))
    # extract numbers
    print(match.group(2))

Vì vậy, đây là cách đơn giản để truy cập vào từng nhóm miễn là các mẫu được khớp.

["ab","cde","fghi","jkl","mn"]
0

Nhóm chụp Regex nhiều lần

Trong các ví dụ trước, chúng tôi đã sử dụng phương pháp tìm kiếm. Nó sẽ chỉ trả lại trận đấu đầu tiên cho mỗi nhóm. Nhưng điều gì sẽ xảy ra nếu một chuỗi chứa nhiều lần xuất hiện của một nhóm Regex và bạn muốn trích xuất tất cả các trận đấu.

Trong phần này, chúng tôi sẽ học cách ghi lại tất cả các trận đấu với một nhóm Regex. Để nắm bắt tất cả các kết quả phù hợp với một nhóm regex, chúng ta cần sử dụng phương thức findIter ().

Thí dụ

["ab","cde","fghi","jkl","mn"]
1

Nhóm bắt giữ ở Regex trong Python là gì?

Một nhóm là một phần của mô hình regex được đặt trong ngoặc đơn () metacharacter. Chúng tôi tạo một nhóm bằng cách đặt mẫu regex bên trong tập hợp các dấu ngoặc đơn (và). Ví dụ, biểu thức chính quy (CAT) tạo ra một nhóm duy nhất chứa các chữ cái 'C', 'A' và 'T'.a part of a regex pattern enclosed in parentheses () metacharacter. We create a group by placing the regex pattern inside the set of parentheses ( and ) . For example, the regular expression (cat) creates a single group containing the letters 'c', 'a', and 't'.

Làm cách nào để bắt một nhóm trong regex?

Các nhóm bắt giữ là một cách để coi nhiều ký tự như một đơn vị.Chúng được tạo ra bằng cách đặt các ký tự được nhóm bên trong một tập hợp dấu ngoặc đơn.Ví dụ, biểu thức chính quy (chó) tạo ra một nhóm duy nhất chứa các chữ cái "D" "O" và "G" ...
((A)(B(C))).
(B(C)).

Nhóm Match () trong Python là gì?

Khớp các đối tượng trong trận đấu Python Regex.nhóm () trả về trận đấu từ chuỗi.Đây sẽ là A15 trong ví dụ đầu tiên của chúng tôi.cuộc thi đấu.Bắt đầu () và khớp.returns the match from the string. This would be a15 in our first example. match. start() and match.

Finditer trong Python là gì?

Theo Python Docs, re.finditer (mẫu, chuỗi, cờ = 0) Trả về một trình lặp lại mang lại các phiên bản khớp trên tất cả các kết quả không chồng chéo cho mẫu RE trong chuỗi.Chuỗi được quét từ trái sang phải và các trận đấu được trả về theo thứ tự được tìm thấy.Các trận đấu trống được bao gồm trong kết quả.Return an iterator yielding MatchObject instances over all non-overlapping matches for the RE pattern in string. The string is scanned left-to-right, and matches are returned in the order found. Empty matches are included in the result.