Một Regex để xóa các chữ số trừ các từ bắt đầu bằng #


8

Tôi có một số chuỗi có thể chứa chữ cái, số và ký hiệu '#'.

Tôi muốn xóa các chữ số ngoại trừ các từ bắt đầu bằng '#'

Đây là một ví dụ:

"table9 dolv5e #10n #dec10 #nov8e 23 hello"

Và sản lượng dự kiến ​​là:

"table dolve #10n #dec10 #nov8e  hello"

Làm thế nào tôi có thể làm điều này với regex, stringr hoặc gsub?

Câu trả lời:


6

Làm thế nào về việc nắm bắt mong muốn và thay thế không mong muốn bằng trống (không bị bắt).

gsub("(#\\S+)|\\d+","\\1",x)

Xem bản demo tại regex101 hoặc bản demo R tại tio.run (Tôi không có kinh nghiệm với R)

Câu trả lời của tôi là giả định, luôn có khoảng trắng giữa #foo bar #baz2. Nếu bạn có một cái gì đó như #foo1,bar2:#baz3 4, sử dụng\w (ký tự từ) thay vì \S(không khoảng trắng).


5

Bạn có thể tách chuỗi trên khoảng trắng, xóa các chữ số khỏi mã thông báo nếu chúng không bắt đầu bằng '#' và dán lại:

x <- "table9 dolv5e #10n #dec10 #nov8e 23 hello"
y <- unlist(strsplit(x, ' '))
paste(ifelse(startsWith(y, '#'), y, sub('\\d+', '', y)), collapse = ' ')
# output 
[1] "table dolve #10n #dec10 #nov8e  hello"

1

Bạn sử dụng gsub để xóa các chữ số, ví dụ:

gsub("[0-9]","","table9")
"table"

Và chúng tôi có thể phân tách chuỗi của bạn bằng strsplit:

STRING = "table9 dolv5e #10n #dec10 #nov8e 23 hello"
strsplit(STRING," ")
[[1]]
[1] "table9" "dolv5e" "#10n"   "#dec10" "#nov8e" "23"     "hello"

Chúng ta chỉ cần lặp lại thông qua CHUINGI, với gsub, chỉ áp dụng nó cho các phần tử không có "#"

STRING = unlist(strsplit(STRING," "))
no_hex = !grepl("#",STRING)
STRING[no_hex] = gsub("[0-9]","",STRING[no_hex])
paste(STRING,collapse=" ")
[1] "table dolve #10n #dec10 #nov8e  hello"

0

Giải pháp cơ sở R:

unlisted_strings <- unlist(strsplit(X, "\\s+"))

Y <- paste0(na.omit(ifelse(grepl("[#]", unlisted_strings),

                           unlisted_strings,

                           gsub("\\d+", "", unlisted_strings))), collapse = " ")

Y 

Dữ liệu:

X <- as.character("table9 dolv5e #10n #dec10 #nov8e 23 hello")

Điều này không cho đầu ra mong muốn.
user2474226

0
INPUT = "table9 dolv5e #10n #dec10 #nov8e 23 hello";
OUTPUT = INPUT.match(/[^#\d]+(#\w+|[A-Za-Z]+\w*)/gi).join('');

Bạn có thể xóa cờ i, vì nó không phân biệt chữ hoa chữ thường

Sử dụng mẫu này: [^#\d]+(#\w+|[A-Za-Z]+\w*)

[^#\d]+ = ký tự bắt đầu không có # và chữ số #\w+ = find # theo sau là chữ số hoặc chữ cái [A-Za-z]+\w*= tìm chữ cái theo sau chữ cái và / hoặc số ^ | Bạn có thể thay đổi điều này với \D+\S*= tìm bất kỳ ký tự nào không chỉ khi chữ cái đầu tiên và không chỉ theo sau là chữ cái và / hoặc số. Tôi không đặt \w+\w*nguyên nhân \wgiống như = [\w\d].

Tôi đã thử mã trong JavaScript và nó hoạt động. Nếu bạn muốn kết hợp không chỉ theo sau bằng chữ cái, bạn có thể sử dụng mã

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.