Kết hợp Regex bỏ qua trường hợp google sheet

Vấn đề là tôi phải nắm bắt. Cột A > giá trị khóa chính luôn nằm trong ô A1 hoặc ô A và thu thập dữ liệu bằng cách sử dụng giá trị "BOLT" của cụm từ thông dụng trong ô hoặc "Bolt, bolt. Cả hai" một loại văn bản ô khác có dấu phẩy và. có thể được tìm thấy trong các hàng từ các ô B đến AQ, vào bảng tính mới trong excel hoặc cột AR mới

tìm kết quả. ví dụ.
A1 = khóa chính > Giá trị 001
AR = dữ liệu được lấy từ tất cả các ô hàng dưới dạng B đến AQ = Bolt, Bolt. bu-lông, bu-lông123, bu-lông

hy vọng tôi đã giải thích đúng, tôi chưa quen với biểu thức chính quy, công việc thủ công sẽ giết hết thời gian của tôi nếu bạn chỉ ra bất kỳ giải pháp nào trong tự động hóa bằng biểu thức chính quy, tôi rất biết ơn bạn

Hồi đáp

Biểu thức chính quy là một ngôn ngữ mạnh mẽ để so khớp các mẫu văn bản. Trang này giới thiệu cơ bản về các biểu thức chính quy đủ cho các bài tập Python của chúng ta và chỉ ra cách các biểu thức chính quy hoạt động trong Python. Mô-đun "re" của Python cung cấp hỗ trợ biểu thức chính quy

Trong Python, tìm kiếm biểu thức chính quy thường được viết là

match = re.search(pat, str)

Ở đó. phương thức search() lấy một mẫu biểu thức chính quy và một chuỗi và tìm kiếm mẫu đó trong chuỗi. Nếu tìm kiếm thành công, search() trả về một đối tượng khớp hoặc Không có gì khác. Do đó, tìm kiếm thường được theo sau ngay lập tức bởi câu lệnh if để kiểm tra xem tìm kiếm có thành công hay không, như trong ví dụ sau tìm kiếm từ mẫu '. ' theo sau là một từ gồm 3 chữ cái (chi tiết bên dưới)

import re

str = 'an example word:cat!!'
match = re.search(r'word:\w\w\w', str)
# If-statement after search() tests if it succeeded
if match:
  print('found', match.group()) ## 'found word:cat'
else:
  print('did not find')

import re

str = 'an example word:cat!!'
match = re.search(r'word:\w\w\w', str)
# If-statement after search() tests if it succeeded
if match:
  print('found', match.group()) ## 'found word:cat'
else:
  print('did not find')
1 lưu trữ kết quả tìm kiếm trong một biến có tên là "match". Sau đó, câu lệnh if kiểm tra sự trùng khớp -- nếu đúng thì tìm kiếm thành công và khớp. group() là văn bản phù hợp (e. g. 'từ. con mèo'). Mặt khác, nếu kết quả khớp là sai (Không cụ thể hơn), thì tìm kiếm không thành công và không có văn bản khớp

'r' ở đầu chuỗi mẫu chỉ định một chuỗi "thô" của trăn đi qua các dấu gạch chéo ngược mà không thay đổi, điều này rất thuận tiện cho các biểu thức chính quy (Java rất cần tính năng này. ). Tôi khuyên bạn nên luôn viết các chuỗi mẫu có chữ 'r' như một thói quen

Các mẫu cơ bản

Sức mạnh của biểu thức chính quy là chúng có thể chỉ định các mẫu, không chỉ các ký tự cố định. Dưới đây là các mẫu cơ bản nhất khớp với các ký tự đơn

  • a, X, 9, < -- các ký tự thông thường khớp chính xác với nhau. Các ký tự meta không khớp với chính chúng vì chúng có ý nghĩa đặc biệt là. . ^ $ * + ? . ( ) (chi tiết bên dưới)
  • (dấu chấm) -- khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới '\n'
  • \w -- (chữ thường w) khớp với ký tự "từ". một chữ cái hoặc chữ số hoặc gạch dưới [a-zA-Z0-9_]. Lưu ý rằng mặc dù "từ" là cách ghi nhớ cho điều này, nhưng nó chỉ khớp với một từ duy nhất char, không phải toàn bộ từ. \W (chữ hoa W) khớp với bất kỳ ký tự không phải từ nào
  • \b -- ranh giới giữa từ và phi từ
  • \s -- (chữ thường s) khớp với một ký tự khoảng trắng -- dấu cách, dòng mới, trả về, tab, biểu mẫu [ \n\r\t\f]. \S (chữ hoa S) khớp với bất kỳ ký tự không phải khoảng trắng nào
  • \t, \n, \r -- tab, dòng mới, quay lại
  • \d -- chữ số thập phân [0-9] (một số tiện ích regex cũ hơn không hỗ trợ \d, nhưng tất cả chúng đều hỗ trợ \w và \s)
  • ^ = bắt đầu, $ = kết thúc -- khớp với phần đầu hoặc phần cuối của chuỗi
  • \ -- ức chế "sự đặc biệt" của một ký tự. Vì vậy, ví dụ, sử dụng \. để khớp với dấu chấm hoặc \\ để khớp với dấu gạch chéo. Nếu bạn không chắc liệu một ký tự có ý nghĩa đặc biệt hay không, chẳng hạn như '@', bạn có thể thử đặt một dấu gạch chéo trước ký tự đó, \@. Nếu nó không phải là một chuỗi thoát hợp lệ, như \c, chương trình python của bạn sẽ tạm dừng do lỗi

Ví dụ cơ bản

Câu nói đùa. bạn gọi một con lợn với ba mắt là gì?

Các quy tắc cơ bản của tìm kiếm biểu thức chính quy cho một mẫu trong chuỗi là

  • Quá trình tìm kiếm tiến hành thông qua chuỗi từ đầu đến cuối, dừng ở kết quả khớp đầu tiên được tìm thấy
  • Tất cả các mẫu phải được khớp, nhưng không phải tất cả các chuỗi
  • Nếu
    import re
    
    str = 'an example word:cat!!'
    match = re.search(r'word:\w\w\w', str)
    # If-statement after search() tests if it succeeded
    if match:
      print('found', match.group()) ## 'found word:cat'
    else:
      print('did not find')
    
    1 thành công, trận đấu không phải là Không có và trận đấu cụ thể. group() là văn bản phù hợp
  ## Search for pattern 'iii' in string 'piiig'.
  ## All of the pattern must match, but it may appear anywhere.
  ## On success, match.group() is matched text.
  match = re.search(r'iii', 'piiig') # found, match.group() == "iii"
  match = re.search(r'igs', 'piiig') # not found, match == None

  ## . = any char but \n
  match = re.search(r'..g', 'piiig') # found, match.group() == "iig"

  ## \d = digit char, \w = word char
  match = re.search(r'\d\d\d', 'p123g') # found, match.group() == "123"
  match = re.search(r'\w\w\w', '@@abcd!!') # found, match.group() == "abc"

sự lặp lại

Mọi thứ trở nên thú vị hơn khi bạn sử dụng + và * để chỉ định sự lặp lại trong mẫu

  • + -- 1 hoặc nhiều lần xuất hiện của mẫu ở bên trái, e. g. 'i+' = một hoặc nhiều tôi
  • * -- 0 hoặc nhiều lần xuất hiện của mẫu bên trái
  • ?

Ngoài cùng bên trái và lớn nhất

Đầu tiên, tìm kiếm tìm kết quả khớp ngoài cùng bên trái cho mẫu và thứ hai, nó cố gắng sử dụng càng nhiều chuỗi càng tốt -- tôi. e. + và * đi càng xa càng tốt (dấu + và * được cho là "tham lam")

Ví dụ lặp lại

  ## i+ = one or more i's, as many as possible.
  match = re.search(r'pi+', 'piiig') # found, match.group() == "piii"

  ## Finds the first/leftmost solution, and within it drives the +
  ## as far as possible (aka 'leftmost and largest').
  ## In this example, note that it does not get to the second set of i's.
  match = re.search(r'i+', 'piigiiii') # found, match.group() == "ii"

  ## \s* = zero or more whitespace chars
  ## Here look for 3 digits, possibly separated by whitespace.
  match = re.search(r'\d\s*\d\s*\d', 'xx1 2   3xx') # found, match.group() == "1 2   3"
  match = re.search(r'\d\s*\d\s*\d', 'xx12  3xx') # found, match.group() == "12  3"
  match = re.search(r'\d\s*\d\s*\d', 'xx123xx') # found, match.group() == "123"

  ## ^ = matches the start of string, so this fails:
  match = re.search(r'^b\w+', 'foobar') # not found, match == None
  ## but without the ^ it succeeds:
  match = re.search(r'b\w+', 'foobar') # found, match.group() == "bar"

Ví dụ về email

Giả sử bạn muốn tìm địa chỉ email bên trong chuỗi 'xyz alice-b@google. com khỉ tím'. Chúng tôi sẽ sử dụng điều này làm ví dụ đang chạy để minh họa các tính năng biểu thức chính quy hơn. Đây là một nỗ lực sử dụng mẫu r'\w+@\w+'

  str = 'purple [email protected] monkey dishwasher'
  match = re.search(r'\w+@\w+', str)
  if match:
    print(match.group())  ## 'b@google'

Tìm kiếm không nhận được toàn bộ địa chỉ email trong trường hợp này vì \w không khớp với '-' hoặc '. ' trong địa chỉ. Chúng tôi sẽ khắc phục điều này bằng cách sử dụng các tính năng biểu thức chính quy bên dưới

Dấu ngoặc vuông

Dấu ngoặc vuông có thể được sử dụng để biểu thị một bộ ký tự, vì vậy [abc] khớp với 'a' hoặc 'b' hoặc 'c'. Các mã \w, \s, v.v. cũng hoạt động bên trong dấu ngoặc vuông với một ngoại lệ là dấu chấm (. ) chỉ có nghĩa là một dấu chấm theo nghĩa đen. Đối với vấn đề về email, dấu ngoặc vuông là một cách dễ dàng để thêm '. ' và '-' thành tập hợp các ký tự có thể xuất hiện xung quanh @ với mẫu r'[\w. -]+@[\w. -]+' để lấy toàn bộ địa chỉ email

  match = re.search(r'[\w.-]+@[\w.-]+', str)
  if match:
    print(match.group())  ## '[email protected]'
(Thêm các tính năng của dấu ngoặc vuông) Bạn cũng có thể sử dụng dấu gạch ngang để biểu thị một phạm vi, vì vậy [a-z] khớp với tất cả các chữ cái viết thường. Để sử dụng dấu gạch ngang mà không chỉ ra phạm vi, hãy đặt dấu gạch ngang cuối cùng, e. g. [abc-]. Một up-hat (^) ở đầu một bộ ngoặc vuông sẽ đảo ngược nó, vì vậy [^ab] có nghĩa là bất kỳ ký tự nào ngoại trừ 'a' hoặc 'b'

Khai thác nhóm

Tính năng "nhóm" của biểu thức chính quy cho phép bạn chọn ra các phần của văn bản phù hợp. Giả sử đối với sự cố email mà chúng tôi muốn trích xuất riêng tên người dùng và Máy chủ lưu trữ. Để làm điều này, hãy thêm dấu ngoặc đơn ( ) xung quanh tên người dùng và máy chủ lưu trữ trong mẫu, như thế này. r'([\w. -]+)@([\w. -]+)'. Trong trường hợp này, dấu ngoặc đơn không thay đổi nội dung mẫu sẽ khớp, thay vào đó, chúng thiết lập các "nhóm" logic bên trong văn bản khớp. Khi tìm kiếm thành công, khớp. nhóm(1) là văn bản khớp tương ứng với dấu ngoặc đơn bên trái thứ nhất và khớp. nhóm(2) là văn bản tương ứng với dấu ngoặc đơn thứ 2 bên trái. trận đấu đơn giản. group() vẫn là toàn bộ văn bản khớp như bình thường

________số 8

Một quy trình công việc phổ biến với các biểu thức chính quy là bạn viết một mẫu cho thứ bạn đang tìm kiếm, thêm các nhóm dấu ngoặc đơn để trích xuất các phần bạn muốn

tìm tất cả

findall() có lẽ là hàm mạnh nhất trong re module. Ở trên chúng tôi đã sử dụng lại. search() để tìm kết quả khớp đầu tiên cho một mẫu. findall() tìm *tất cả* các kết quả khớp và trả về chúng dưới dạng danh sách các chuỗi, với mỗi chuỗi đại diện cho một kết quả khớp.
  ## Suppose we have a text with many email addresses
  str = 'purple [email protected], blah monkey [email protected] blah dishwasher'

  ## Here re.findall() returns a list of all the found email strings
  emails = re.findall(r'[\w\.-]+@[\w\.-]+', str) ## ['[email protected]', '[email protected]']
  for email in emails:
    # do something with each found email string
    print(email)

tìm tất cả với tệp

Đối với các tệp, bạn có thể có thói quen viết một vòng lặp để lặp qua các dòng của tệp và sau đó bạn có thể gọi hàm findall() trên mỗi dòng. Thay vào đó, hãy để findall() thực hiện việc lặp lại cho bạn -- tốt hơn nhiều. Chỉ cần nạp toàn bộ văn bản của tệp vào findall() và để nó trả về danh sách tất cả các kết quả phù hợp trong một bước duy nhất (hãy nhớ rằng f. read() trả về toàn bộ văn bản của tệp trong một chuỗi)

import re

str = 'an example word:cat!!'
match = re.search(r'word:\w\w\w', str)
# If-statement after search() tests if it succeeded
if match:
  print('found', match.group()) ## 'found word:cat'
else:
  print('did not find')
0

tìm tất cả và Nhóm

Cơ chế nhóm ngoặc đơn ( ) có thể được kết hợp với findall(). Nếu mẫu bao gồm 2 hoặc nhiều nhóm dấu ngoặc đơn, thì thay vì trả về danh sách chuỗi, findall() trả về danh sách *bộ*. Mỗi bộ đại diện cho một đối sánh của mẫu và bên trong bộ là nhóm(1), nhóm(2). dữ liệu. Vì vậy, nếu 2 nhóm dấu ngoặc đơn được thêm vào mẫu email, thì findall() trả về một danh sách các bộ, mỗi bộ có độ dài 2 chứa tên người dùng và máy chủ, e. g. ('alice', 'google. com')

import re

str = 'an example word:cat!!'
match = re.search(r'word:\w\w\w', str)
# If-statement after search() tests if it succeeded
if match:
  print('found', match.group()) ## 'found word:cat'
else:
  print('did not find')
1

Khi bạn có danh sách các bộ dữ liệu, bạn có thể lặp qua nó để thực hiện một số tính toán cho từng bộ dữ liệu. Nếu mẫu không bao gồm dấu ngoặc đơn, thì findall() trả về danh sách các chuỗi tìm thấy như trong các ví dụ trước đó. Nếu mẫu bao gồm một bộ dấu ngoặc đơn, thì findall() trả về danh sách các chuỗi tương ứng với nhóm đơn đó. (Tính năng tùy chọn tối nghĩa. Đôi khi bạn có các nhóm paren ( ) trong mẫu, nhưng bạn không muốn trích xuất. Trong trường hợp đó, hãy viết dấu ngoặc đơn bằng dấu ?. lúc đầu e. g. (?. ) và dấu ngoặc trái đó sẽ không được tính là kết quả nhóm. )

Luồng công việc RE và Gỡ lỗi

Các mẫu biểu thức chính quy gói gọn rất nhiều ý nghĩa vào chỉ một vài ký tự , nhưng chúng rất dày đặc, bạn có thể mất nhiều thời gian để gỡ lỗi các mẫu của mình. Thiết lập thời gian chạy của bạn để bạn có thể chạy một mẫu và in những gì nó phù hợp một cách dễ dàng, ví dụ bằng cách chạy nó trên một văn bản thử nghiệm nhỏ và in kết quả của findall(). Nếu mẫu không khớp với gì, hãy thử làm yếu mẫu, loại bỏ các phần của mẫu để bạn nhận được quá nhiều mẫu phù hợp. Khi nó không khớp, bạn không thể đạt được bất kỳ tiến bộ nào vì không có gì cụ thể để xem xét. Khi nó khớp quá nhiều, thì bạn có thể siết chặt nó dần dần để đạt được thứ bạn muốn

Tùy chọn

Các chức năng re có các tùy chọn để sửa đổi hành vi của khớp mẫu. Cờ tùy chọn được thêm vào dưới dạng đối số bổ sung cho tìm kiếm() hoặc findall(), v.v. , e. g. lại. tìm kiếm (vỗ, str, lại. BỎ QUA TRƯỜNG HỢP)

  • IGNORECASE -- bỏ qua sự khác biệt về chữ hoa/chữ thường để so khớp, vì vậy 'a' khớp với cả 'a' và 'A'
  • DOTALL -- cho phép dấu chấm (. ) để khớp với dòng mới -- thông thường nó khớp với mọi thứ trừ dòng mới. Điều này có thể khiến bạn vấp ngã -- bạn nghĩ. * khớp với mọi thứ, nhưng theo mặc định, nó không vượt qua cuối dòng. Lưu ý rằng \s (khoảng trắng) bao gồm các dòng mới, vì vậy nếu bạn muốn khớp một loạt khoảng trắng có thể bao gồm một dòng mới, bạn chỉ cần sử dụng \s*
  • MULTILINE -- Trong một chuỗi gồm nhiều dòng, cho phép ^ và $ khớp với phần đầu và phần cuối của mỗi dòng. Thông thường ^/$ sẽ chỉ khớp với phần đầu và phần cuối của toàn bộ chuỗi

tham lam vs. Không tham lam (tùy chọn)

Đây là phần tùy chọn hiển thị một kỹ thuật biểu thức chính quy nâng cao hơn không cần thiết cho các bài tập

Suppose you have text with tags in it: foo and so on

Suppose you are trying to match each tag with the pattern '(<.*>)' -- what does it match first?

The result is a little surprising, but the greedy aspect of the .* causes it to match the whole 'foo and so on' as one big match. The problem is that the .* goes as far as is it can, instead of stopping at the first > (aka it is "greedy").

There is an extension to regular expression where you add a ? at the end, such as .*? or .+?, changing them to be non-greedy. Now they stop as soon as they can. So the pattern '(<.*?>)' will get just '' as the first match, and '' as the second match, and so on getting each <..> pair in turn. The style is typically that you use a .*?, and then immediately its right look for some concrete marker (> in this case) that forces the end of the .*? run.

Các *? . Python bao gồm hỗ trợ pcre. Nhiều tiện ích dòng lệnh, v.v. có một lá cờ nơi họ chấp nhận các mẫu pcre

Một kỹ thuật cũ hơn nhưng được sử dụng rộng rãi để mã hóa ý tưởng "tất cả các ký tự này ngoại trừ dừng ở X" sử dụng kiểu dấu ngoặc vuông. Đối với những điều trên, bạn có thể viết mẫu, nhưng thay vì. * để lấy tất cả các ký tự, hãy sử dụng [^>]* để bỏ qua tất cả các ký tự không phải > (^ "đảo ngược" bộ dấu ngoặc vuông đứng đầu, để nó khớp với bất kỳ ký tự nào không nằm trong dấu ngoặc vuông)

Thay thế (tùy chọn)

Ở đó. hàm sub(pat, replacement, str) tìm kiếm tất cả các trường hợp của mẫu trong chuỗi đã cho và thay thế chúng. Chuỗi thay thế có thể bao gồm '\1', '\2' đề cập đến văn bản từ nhóm(1), nhóm(2), v.v. từ văn bản phù hợp ban đầu

Đây là một ví dụ tìm kiếm tất cả các địa chỉ email và thay đổi chúng để giữ người dùng (\1) nhưng có yo-yo-dyne. com với tư cách là người dẫn chương trình

Làm cách nào bạn có thể đặt biểu thức chính quy để khớp bất kể chữ hoa chữ thường?

Nếu bạn chỉ muốn một phần của biểu thức chính quy phân biệt chữ hoa chữ thường (như câu trả lời ban đầu của tôi đã đoán), thì bạn có hai tùy chọn. .
Sử dụng công cụ sửa đổi chế độ (?i) và [tùy chọn] (?-i). (?i)G[a-b](?- i). *
Đặt tất cả các biến thể (i. e. chữ thường và chữ hoa) trong biểu thức chính quy - hữu ích nếu công cụ sửa đổi chế độ không được hỗ trợ. [gG][a-bA-B]. *

Trường hợp đối sánh regex có nhạy cảm không?

Theo mặc định, việc so sánh chuỗi đầu vào với bất kỳ ký tự chữ nào trong mẫu biểu thức chính quy là phân biệt chữ hoa chữ thường , khoảng trắng trong mẫu biểu thức chính quy được hiểu là chữ trắng- .

Regexmatch có hoạt động với các con số không?

Hàm này chỉ hoạt động với đầu vào là văn bản (không phải số) và trả về một giá trị logic, i. e. TRUE hoặc FALSE , như đầu ra. Nếu các số được sử dụng làm đầu vào, hãy chuyển đổi chúng thành văn bản bằng hàm TEXT.

Quy trình để tạo một biểu thức bình thường trong trường hợp regex không nhạy cảm là gì?

BỎ QUA TRƯỜNG HỢP. Cờ này cho phép khớp không phân biệt chữ hoa chữ thường của Biểu thức chính quy với chuỗi đã cho i. e. các biểu thức như [A-Z] cũng sẽ khớp với các chữ cái viết thường. Nói chung, Nó được thông qua như một đối số tùy chọn để tái. biên dịch()