Để lấy danh sách tất cả các số trong Chuỗi, hãy sử dụng biểu thức chính quy '[0-9]+' với re. phương thức findall(). [0-9] đại diện cho một biểu thức chính quy để khớp với một chữ số trong chuỗi. [0-9]+ đại diện cho các chuỗi chữ số liên tục có độ dài bất kỳ Show
trong đó str là chuỗi mà chúng ta cần tìm các số. lại. findall() trả về danh sách các chuỗi khớp với biểu thức chính quy ví dụ 1. Lấy danh sách tất cả các số trong ChuỗiTrong ví dụ sau, chúng ta sẽ lấy một chuỗi, Chương trình Python Chạyđầu ra
ví dụ 2. Lấy danh sách tất cả các chữ số liên tục trong ChuỗiTrong ví dụ sau, chúng ta sẽ lấy một chuỗi, Chương trình Python Chạyđầu ra
Tóm lượcTrong hướng dẫn về Ví dụ Python này, chúng ta đã học cách lấy tất cả các số tạo thành một chuỗi dưới dạng danh sách, sử dụng Biểu thức chính quy Python, với sự trợ giúp của các chương trình ví dụ Xử lý chuỗi khá dễ dàng trong Stata do có nhiều hàm chuỗi tích hợp sẵn. Trong số các hàm chuỗi này có ba hàm liên quan đến biểu thức chính quy, regexm để khớp, regexr để thay thế và regexs cho các biểu thức con. Chúng tôi sẽ trình bày một số ví dụ về cách sử dụng biểu thức chính quy để trích xuất và/hoặc thay thế một phần của biến chuỗi bằng ba hàm này. Ở cuối trang là phần giải thích về tất cả các toán tử biểu thức chính quy cũng như các hàm hoạt động với biểu thức chính quy ví dụví dụ 1. Một nhà nghiên cứu có địa chỉ dưới dạng một biến chuỗi và muốn tạo một biến mới chỉ chứa các mã zip ví dụ 2. Ta có một biến chứa họ và tên theo thứ tự họ và tên. Ta muốn tạo một biến mới có họ và tên theo thứ tự họ và tên cách nhau bởi dấu phẩy ví dụ 2. Ngày được nhập dưới dạng một biến chuỗi, trong một số trường hợp, năm được nhập dưới dạng giá trị có bốn chữ số (đây là giá trị mà Stata thường mong đợi thấy), nhưng trong các trường hợp khác, nó được nhập dưới dạng giá trị có hai chữ số. Chúng tôi muốn tạo một biến ngày ở định dạng số dựa trên biến chuỗi này. Nhiệm vụ này thực sự có thể dễ dàng được xử lý bằng các lệnh Stata thông thường, hãy xem trang Câu hỏi thường gặp của chúng tôi “Biến ngày tháng của tôi là một chuỗi, làm cách nào để biến nó thành biến ngày tháng mà Stata có thể nhận ra?” . Chúng tôi đã đưa ví dụ này vào đây với mục đích trình diễn, không phải vì biểu thức chính quy nhất thiết là cách tốt nhất để xử lý tình huống này Trong những tình huống này, các biểu thức chính quy có thể được sử dụng để xác định các trường hợp trong đó một chuỗi chứa một tập hợp các giá trị (e. g. một từ cụ thể, một số theo sau bởi một từ, v.v. ) và trích xuất bộ giá trị đó từ toàn bộ chuỗi để sử dụng ở nơi khác ví dụ 1. Trích xuất mã zip từ địa chỉHãy bắt đầu với một số mục địa chỉ giả mạo input str60 address "4905 Lakeway Drive, College Station, Texas 77845 USA" "673 Jasmine Street, Los Angeles, CA 90024" "2376 First street, San Diego, CA 90126" "6 West Central St, Tempe AZ 80068" "1234 Main St. Cambridge, MA 01238-1234" end Để tìm mã zip, chúng tôi sẽ tìm một số có năm chữ số trong một địa chỉ. Lệnh gen (viết tắt của "generate") bên dưới yêu cầu Stata tạo một biến mới gọi là zip. Phần còn lại của lệnh hơi phức tạp, "if" được đánh giá trước, if(regexm(address, “[0-9][0-9][0-9][0-9][0-9] . Chúng tôi cho biết rằng chúng tôi muốn một số có năm chữ số bằng cách chỉ định “[0-9]” năm lần. Trừ khi được chỉ định khác bằng cách sử dụng *, + hoặc ? . Điều này có nghĩa là xâu năm biểu thức này lại với nhau sẽ cho phép chúng ta tìm một xâu có đúng năm chữ số. Lưu ý rằng 0-9 chỉ ra rằng biểu thức phải khớp với bất kỳ ký tự nào từ 0 đến 9 (i. e. 0, 1, 2, 3, 4, 5, 6, 7, 8 và 9 đều khớp nhau) gen zip = regexs(0) if(regexm(address, "[0-9][0-9][0-9][0-9][0-9]")) list +--------------------------------------------------------------+ | address zip | |--------------------------------------------------------------| 1. | 4905 Lakeway Drive, College Station, Texas 77845 USA 77845 | 2. | 673 Jasmine Street, Los Angeles, CA 90024 90024 | 3. | 2376 First street, San Diego, CA 90126 90126 | 4. | 6 West Central St, Tempe AZ 80068 80068 | 5. | 1234 Main St. Cambridge, MA 01238-1234 01238 | +--------------------------------------------------------------+ Ví dụ 1, Biến thể Số 1Trong ví dụ đơn giản của chúng tôi ở trên, không có địa chỉ nào có số đường gồm năm chữ số. Điều gì sẽ xảy ra nếu có những địa chỉ có số đường gồm năm chữ số? clear input str60 address "4905 Lakeway Drive, College Station, Texas 77845" "673 Jasmine Street, Los Angeles, CA 90024" "2376 First street, San Diego, CA 90126" "66666 West Central St, Tempe AZ 80068" "12345 Main St. Cambridge, MA 01238" end gen zip = regexs(0) if(regexm(address, "[0-9][0-9][0-9][0-9][0-9]")) list +----------------------------------------------------------+ | address zip | |----------------------------------------------------------| 1. | 4905 Lakeway Drive, College Station, Texas 77845 77845 | 2. | 673 Jasmine Street, Los Angeles, CA 90024 90024 | 3. | 2376 First street, San Diego, CA 90126 90126 | 4. | 66666 West Central St, Tempe AZ 80068 66666 | 5. | 12345 Main St. Cambridge, MA 01238 12345 | +----------------------------------------------------------+ Rõ ràng, điều này không hoạt động chính xác vì hai hàng cuối cùng của biến zip đã chọn số đường cho các địa chỉ này thay vì mã zip. Trong tập dữ liệu này, mã zip xuất hiện ở cuối chuỗi địa chỉ. Nếu chúng tôi cho rằng đây là trường hợp của tất cả các địa chỉ trong dữ liệu, thì biện pháp khắc phục sẽ thực sự đơn giản. Chúng tôi có thể chỉ định "[0-9][0-9][0-9][0-9][0-9]$" sẽ hướng dẫn Stata tìm một số có năm chữ số ở cuối chuỗi ________số 8_______ Ví dụ 1, Biến thể số 2Đôi khi mã zip cũng bao gồm phần mở rộng gồm bốn chữ số và tên quốc gia cũng có thể xuất hiện ở cuối địa chỉ, chẳng hạn như ở một số địa chỉ được hiển thị bên dưới clear input str60 address "4905 Lakeway Drive, College Station, Texas 77845 USA" "673 Jasmine Street, Los Angeles, CA 90024" "2376 First street, San Diego, CA 90126" "66666 West Central St, Tempe AZ 80068" "12345 Main St. Cambridge, MA 01238-1234" "12345 Main St Sommerville MA 01239-2345" "12345 Main St Watertwon MA 01239 USA" end Trong loại tình huống thực tế hơn này, mã trong các ví dụ trước sẽ không hoạt động chính xác vì có các ký tự thừa sau mã zip được trích xuất. Đây là cách chúng ta có thể làm điều đó bằng cách sử dụng một biểu thức chính quy phức tạp hơn gen zip = regexs(1) if regexm(address, "([0-9][0-9][0-9][0-9][0-9])[-]*[0-9]*[ a-zA-Z]*$")list+--------------------------------------------------------------+ | address zip | |--------------------------------------------------------------| 1. | 4905 Lakeway Drive, College Station, Texas 77845 USA 77845 | 2. | 673 Jasmine Street, Los Angeles, CA 90024 90024 | 3. | 2376 First street, San Diego, CA 90126 90126 | 4. | 66666 West Central St, Tempe AZ 80068 80068 | 5. | 12345 Main St. Cambridge, MA 01238-1234 01238 | |--------------------------------------------------------------| 6. | 12345 Main St Sommerville MA 01239-2345 01239 | 7. | 12345 Main St Watertwon MA 01239 USA 01239 | +--------------------------------------------------------------+ Những gì chúng tôi đã thêm vào trong biểu thức chính quy là phụ này. "[-]*[0-9]*[a-zA-Z]*". Có ba thành phần trong biểu thức chính quy này
Những bổ sung này cho phép chúng tôi khớp các trường hợp có các ký tự ở cuối sau mã zip và trích xuất mã zip một cách chính xác. Lưu ý rằng chúng tôi cũng đã sử dụng "regexs(1)" thay vì "regexs(0)" như chúng tôi đã làm trước đây, bởi vì chúng tôi hiện đang sử dụng các biểu thức con được biểu thị bằng cặp dấu ngoặc đơn trong "([0-9][0-9][ . Một chiến lược khác có thể hoạt động tốt hơn trong một số trường hợp là biểu thức chính quy gen zip2 = regexs(1) if(regexm(address, ".*([0-9][0-9][0-9][0-9][0-9])")) Trong ví dụ này, khoảng thời gian (i. e. “. ”) khớp với bất kỳ ký tự nào và chỉ dấu hoa thị (“*”) khớp với bất kỳ ký tự nào. Cùng với nhau, cả hai chỉ ra rằng số chúng ta đang tìm kiếm không nên xuất hiện ở đầu chuỗi, mà có thể xuất hiện ở bất kỳ đâu sau đó. ví dụ 2. Trích xuất tên và họ và chuyển đổi thứ tự của họChúng tôi có một biến chứa tên đầy đủ của một người theo thứ tự tên và sau đó là họ. Ta muốn tạo một biến mới cho họ và tên theo thứ tự họ và tên cách nhau bởi dấu phẩy. Để bắt đầu, hãy tạo một tập dữ liệu mẫu clear input str40 fullname "John Adams" "Adam Smiths" "Mary Smiths" "Charlie Wade" end Bây giờ chúng ta cần nắm bắt từ đầu tiên và từ thứ hai và hoán đổi chúng. Đây là biểu thức chính quy cho mục đích này. (([a-zA-Z]+)[ ]*([a-zA-Z]+)) Có ba phần trong biểu thức chính quy này
gen zip = regexs(0) if(regexm(address, "[0-9][0-9][0-9][0-9][0-9]")) list +--------------------------------------------------------------+ | address zip | |--------------------------------------------------------------| 1. | 4905 Lakeway Drive, College Station, Texas 77845 USA 77845 | 2. | 673 Jasmine Street, Los Angeles, CA 90024 90024 | 3. | 2376 First street, San Diego, CA 90126 90126 | 4. | 6 West Central St, Tempe AZ 80068 80068 | 5. | 1234 Main St. Cambridge, MA 01238-1234 01238 | +--------------------------------------------------------------+0 Điều này thực sự hoạt động. Hãy xem cách regex hoạt động trong trường hợp này. regex thực sự xác định một số phần, dựa trên toàn bộ biểu thức cũng như các biểu thức con. Đoạn mã sau sử dụng biểu thức chính quy để đặt từng thành phần này (biểu thức con) vào biến riêng của nó và sau đó hiển thị chúng gen zip = regexs(0) if(regexm(address, "[0-9][0-9][0-9][0-9][0-9]")) list +--------------------------------------------------------------+ | address zip | |--------------------------------------------------------------| 1. | 4905 Lakeway Drive, College Station, Texas 77845 USA 77845 | 2. | 673 Jasmine Street, Los Angeles, CA 90024 90024 | 3. | 2376 First street, San Diego, CA 90126 90126 | 4. | 6 West Central St, Tempe AZ 80068 80068 | 5. | 1234 Main St. Cambridge, MA 01238-1234 01238 | +--------------------------------------------------------------+1 ví dụ 3. Giá trị hai và bốn chữ số cho nămTrong ví dụ này, chúng tôi có ngày được nhập dưới dạng biến chuỗi. Stata có thể xử lý việc này bằng cách sử dụng các lệnh tiêu chuẩn (xem "Biến ngày của tôi là một chuỗi, làm cách nào để biến nó thành một biến ngày mà Stata có thể nhận ra?"), chúng tôi đang sử dụng điều này làm ví dụ về những gì bạn có thể làm với các biểu thức chính quy. Mục tiêu của quy trình này là tạo ra một biến chuỗi với năm có bốn chữ số thích hợp cho mọi trường hợp, sau đó Stata có thể dễ dàng chuyển đổi thành một ngày tháng. Để làm điều này, chúng tôi sẽ bắt đầu bằng cách tách từng thành phần của ngày (ngày, tháng và năm có hai hoặc bốn chữ số) thành một biến riêng biệt, sau đó chúng tôi sẽ gán năm có bốn chữ số chính xác cho các trường hợp hiện chỉ có Đầu tiên, nhập ngày gen zip = regexs(0) if(regexm(address, "[0-9][0-9][0-9][0-9][0-9]")) list +--------------------------------------------------------------+ | address zip | |--------------------------------------------------------------| 1. | 4905 Lakeway Drive, College Station, Texas 77845 USA 77845 | 2. | 673 Jasmine Street, Los Angeles, CA 90024 90024 | 3. | 2376 First street, San Diego, CA 90126 90126 | 4. | 6 West Central St, Tempe AZ 80068 80068 | 5. | 1234 Main St. Cambridge, MA 01238-1234 01238 | +--------------------------------------------------------------+2 Tiếp theo, chúng tôi muốn xác định ngày trong tháng và đặt nó vào một biến có tên là ngày. Để làm điều này, chúng tôi hướng dẫn Stata tìm ngày bằng cách nhìn vào phần đầu của chuỗi (i. e. ngày), cho một hoặc nhiều giá trị từ 0-9. (Nói cách khác, hãy tìm một số ở đầu dòng, vì chúng ta biết dãy số đầu tiên là ngày. ) Tạo một ngày biến mới và đặt nó bằng giá trị đó gen zip = regexs(0) if(regexm(address, "[0-9][0-9][0-9][0-9][0-9]")) list +--------------------------------------------------------------+ | address zip | |--------------------------------------------------------------| 1. | 4905 Lakeway Drive, College Station, Texas 77845 USA 77845 | 2. | 673 Jasmine Street, Los Angeles, CA 90024 90024 | 3. | 2376 First street, San Diego, CA 90126 90126 | 4. | 6 West Central St, Tempe AZ 80068 80068 | 5. | 1234 Main St. Cambridge, MA 01238-1234 01238 | +--------------------------------------------------------------+3 Dòng cú pháp dưới đây tìm tháng bằng cách tìm một hoặc nhiều chữ cái cùng nhau trong chuỗi. Sau đó, tạo biến tháng và đặt nó bằng tháng được xác định trong chuỗi gen zip = regexs(0) if(regexm(address, "[0-9][0-9][0-9][0-9][0-9]")) list +--------------------------------------------------------------+ | address zip | |--------------------------------------------------------------| 1. | 4905 Lakeway Drive, College Station, Texas 77845 USA 77845 | 2. | 673 Jasmine Street, Los Angeles, CA 90024 90024 | 3. | 2376 First street, San Diego, CA 90126 90126 | 4. | 6 West Central St, Tempe AZ 80068 80068 | 5. | 1234 Main St. Cambridge, MA 01238-1234 01238 | +--------------------------------------------------------------+4 Năm là nơi mọi thứ trở nên phức tạp hơn. Lưu ý rằng các giá trị để chỉ định thế kỷ dựa trên kiến thức của tôi về “dữ liệu. ” Trước hết, chúng tôi trích xuất tất cả các chữ số cho năm. Chúng tôi sử dụng toán tử "$" để chỉ ra rằng tìm kiếm từ cuối chuỗi. Sau đó, chúng tôi biến biến chuỗi thành biến số bằng cách sử dụng hàm "real" của Stata. Hành động tiếp theo liên quan đến việc xử lý các năm có hai chữ số bắt đầu bằng "0". Điều này tương ứng với những năm gần đây trong thế kỷ XXI. Để biến những năm này thành năm có bốn chữ số, chúng ta nối (sử dụng dấu +) chuỗi được xác định (năm có hai chữ số) với chuỗi "20". Tiếp theo, chúng ta sẽ tìm các năm có hai chữ số 10-99 và nối các chuỗi đó với chuỗi "19". Cuối cùng, chúng tôi tạo biến date2 là ngày của chúng tôi chỉ chứa năm có bốn chữ số. (Chúng ta cũng có thể sử dụng ba biến ngày, tháng, năm để tạo biến ngày tháng bằng các hàm ngày của Stata. ) gen zip = regexs(0) if(regexm(address, "[0-9][0-9][0-9][0-9][0-9]")) list +--------------------------------------------------------------+ | address zip | |--------------------------------------------------------------| 1. | 4905 Lakeway Drive, College Station, Texas 77845 USA 77845 | 2. | 673 Jasmine Street, Los Angeles, CA 90024 90024 | 3. | 2376 First street, San Diego, CA 90126 90126 | 4. | 6 West Central St, Tempe AZ 80068 80068 | 5. | 1234 Main St. Cambridge, MA 01238-1234 01238 | +--------------------------------------------------------------+5
|