Regex để loại bỏ các số 0 đứng đầu trong R, trừ khi ký tự cuối cùng (hoặc duy nhất) bằng không


9
gsub("(?<![0-9])0+", "", c("005", "0AB", "000", "0"), perl = TRUE)
#> [1] "5"  "AB" ""   ""
gsub("(^|[^0-9])0+", "\\1", c("005", "0AB", "000", "0"), perl = TRUE)
#> [1] "5"  "AB" ""   ""

Biểu thức chính quy ở trên là từ luồng SO này giải thích cách loại bỏ tất cả các số 0 đứng đầu khỏi một chuỗi trong R. Do đó, biểu thức chính quy này cả "000" và "0" được chuyển thành "". Thay vào đó, tôi muốn xóa tất cả các số 0 đứng đầu khỏi một chuỗi các ký tự, ngoại trừ các trường hợp khi ký tự cuối cùng bằng 0 hoặc ký tự duy nhất bằng 0.

"005" would become "5"
"0AB" would become "AB"
"000" would become "0"
"0"   would become "0"

Chủ đề SO khác này giải thích cách thực hiện những gì tôi muốn, nhưng tôi không nghĩ rằng tôi đang nhận được cú pháp khá chính xác, áp dụng giải pháp trong R. Và tôi không thực sự hiểu sự khác biệt giữa giải pháp 1 và 2 bên dưới ( nếu họ thực sự làm việc).

gsub("s/^0*(\d+)$/$1/;", "", c("005", "0AB", "000", "0"), perl = TRUE)  # 1st solution
# Error: '\d' is an unrecognized escape in character string starting ""s/^0*(\d"
gsub("s/0*(\d+)/$1/;", "", c("005", "0AB", "000", "0"), perl = TRUE)    # 2nd solution
# Error: '\d' is an unrecognized escape in character string starting ""s/0*(\d"

Regex thích hợp trong R để có được những gì tôi muốn là gì?

Câu trả lời:


6

Bạn có thể xóa tất cả các số không từ đầu chuỗi nhưng không xóa chuỗi cuối:

sub("^0+(?!$)", "", x, perl=TRUE)

Xem bản demo regex .

Chi tiết

  • ^ - bắt đầu một chuỗi
  • 0+ - một hoặc nhiều số không
  • (?!$) - giao diện phủ định không khớp nếu có kết thúc vị trí chuỗi ngay bên phải vị trí hiện tại

Xem bản demo R :

x <- c("005", "0AB", "000", "0")
sub("^0+(?!$)", "", x, perl=TRUE)
## => [1] "5"  "AB" "0"  "0"

1
regexgà mờ. Sự khác biệt hiệu suất (hoặc các ưu đãi khác) giữa mô hình của bạn và điều này là gì ^0*(.+)$hay ^0+(.+)$?
M--

2
@ M-- Đây là các mẫu khác nhau, chỉ nên so sánh hiệu suất của các biểu thức chính tương đương. Bạn là một chút không hiệu quả như .có thể phù hợp 0và cả hai mô hình liền kề được định lượng vô thời hạn, nhưng chỉ là một chút nhỏ.
Wiktor Stribiżew

4

Chúng ta có thể thêm một điều kiện nữa với giao diện regex để kiểm tra mọi giá trị khác không sau một hoặc nhiều số không ( 0+)

sub("(?<![0-9])0+(?=[^0])", "", sub("^0+$", "0", v1), perl = TRUE)
#[1] "5"  "AB" "0"  "0" 

dữ liệu

v1 <- c("005", "0AB", "000", "0")

1
Tôi không phải là regexbậc thầy trong bất kỳ cách nào nhưng nhìn có vẻ không hiệu quả, phải không? Vì bạn có hai subbạn có thể muốn loại bỏ tất cả các số 0 đứng đầu và thay thế ""bằng 0? sub("^$", "0", sub("^0+", "", v1), perl = TRUE)
M--

2
@ M-- Nó sẽ không thể là hiệu quả, nhưng tôi sử dụng nó để theo mã giống như OP
akrun


3

Bạn có thể sử dụng xen kẽ để khớp tất cả các số 0 trong chuỗi trong một nhóm bắt hoặc khớp với tất cả các số 0 từ đầu chuỗi.

Trong nhóm sử dụng thay thế 1.

^0*(0)$|^0+

Bản giới thiệu Regex | Bản demo R

Ví dụ

sub("^0*(0)$|^0+", "\\1", c("005", "0AB", "000", "0"))

Đầu ra

[1] "5"  "AB" "0"  "0"

Hoặc thậm chí tốt hơn như nhận xét của Wiktor Stribiżew , bạn có thể sử dụng bắt một số 0 trong một nhóm và lặp lại chính nhóm đó để ghi lại trường hợp cuối cùng của số không.

^(0)+$|^0+

Bản demo Regex


3
Tôi sẽ sử dụng^(0)+$|^0+
Wiktor Stribiżew 20/12/19

3
Có vẻ như sub("^0+(?!$)", "", x, perl=TRUE)cũng sẽ hoạt động
Wiktor Stribiżew

2

Một regexlựa chọn khác :

^0*(.+)$

Đây là bản demo regex .

Sử dụng base::subtrong R:

sub("^0*(.+)$", "\\1", c("005", "0AB", "000", "0"))  

 ## [1] "5"  "AB" "0"  "0" 

Dưới đây là một bản demo R .

Hoặc mở rộng trên câu trả lời của @ akrun :

sub("^$", "0", sub("^0+", "", c("005", "0AB", "000", "0")), perl = TRUE)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.