마지막 (또는 유일한) 문자가 0이 아닌 경우 R에서 선행 0을 제거하는 정규식


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" ""   ""

위의 정규식 은이 SO 스레드 에서 R의 문자열에서 모든 선행 0 을 제거하는 방법을 설명합니다. 이 정규식의 결과로 "000"과 "0"은 모두 ""로 변환됩니다. 대신 최종 문자가 0이거나 유일한 문자가 0 인 경우를 제외하고 문자열에서 모든 선행 0을 제거하고 싶습니다.

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

이 다른 SO 스레드 는 내가 원하는 것을 수행하는 방법을 설명하지만 R에 솔루션을 적용하여 구문이 상당히 정확하다고 생각하지 않습니다. 그리고 아래의 첫 번째 솔루션과 두 번째 솔루션의 차이점을 실제로 이해하지 못합니다 ( 그들이 실제로 효과가 있다면).

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"

내가 원하는 것을 얻는 R의 올바른 정규식은 무엇입니까?

답변:


6

문자열의 시작에서 모든 0을 제거 할 수 있지만 마지막 0은 제거 할 수 없습니다.

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

정규식 데모를 참조하십시오 .

세부

  • ^ -문자열의 시작
  • 0+ -하나 이상의 0
  • (?!$) -현재 위치의 바로 오른쪽에 문자열 위치의 끝이있는 경우 경기에 실패하는 부정적인 예측

참고 항목 R 데모 :

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

1
regex멍청한 놈. 당신의 패턴이 하나 사이의 성능 차이 (또는 다른 환경 설정) 기능 ^0*(.+)$또는 ^0+(.+)$?
M--

2
@ M-- 패턴이 다르므로 등가 정규식의 성능 만 비교하는 것이 좋습니다. 당신은 .일치 할 수 있는 약간 비효율적 0이며 인접한 패턴은 무한정 수량화되지만 조금만 있습니다.
Wiktor Stribiżew

4

우리는 (하나 이상의 제로 후 0이 아닌 값을 확인하는 정규식 lookaround와 함께 또 하나의 조건을 추가 할 수 있습니다 0+)

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

데이터

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

1
나는 regex어떤 방식으로도 전문가가 아니지만 둘러보기가 효율적이지 않습니다. 두 개가 있으므로 sub모든 선행 0을 제거 ""하고 0?로 바꿀 수 있습니다 . sub("^$", "0", sub("^0+", "", v1), perl = TRUE)
M--

2
@ M-- 그렇게 효율적이지는 않지만 OP와 동일한 코드를 따르는 데 사용했습니다
akrun


3

대체 그룹을 사용하여 캡처 그룹의 문자열에서 모든 0을 일치 시키거나 문자열의 시작에서 모든 0을 일치시킬 수 있습니다.

교체 사용 그룹 1

^0*(0)$|^0+

정규식 데모 | R 데모

예를 들어

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

산출

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

또는 Wiktor Stribiżew가 언급 한 것처럼 그룹에서 단일 0을 캡처하고 그룹 자체를 반복하여 0의 마지막 인스턴스를 캡처 할 수 있습니다.

^(0)+$|^0+

정규식 데모


3
사용^(0)+$|^0+
Wiktor Stribiżew

3
과 같은 sub("^0+(?!$)", "", x, perl=TRUE)의지는 일
Wiktor Stribiżew

2

다른 regex옵션 :

^0*(.+)$

다음은 정규식 데모 입니다.

base::subR에서 사용 :

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

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

다음은 R 데모 입니다.

또는 @akrun의 답변을 확장 :

sub("^$", "0", sub("^0+", "", c("005", "0AB", "000", "0")), perl = TRUE)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.