모든 단어에서 처음 나타나는 문자를 바꾸려면 어떻게해야합니까?


44

모든 단어에서 처음 나타나는 문자를 바꾸려면 어떻게해야합니까?

이 문자열이 있다고 가정 해보십시오.

hello @jon i am @@here or @@@there and want some@thing in '@here"
#     ^         ^^        ^^^                   ^          ^ 

그리고 @모든 단어 에서 첫 번째 단어 를 제거하여 다음과 같은 최종 문자열을 갖습니다.

hello jon i am @here or @@there and want something in 'here
#     ^        ^        ^^                   ^         ^

명확하게하기 위해 "@"문자는 항상 모든 단어에 함께 표시되지만 단어의 시작 부분이나 다른 문자 사이에있을 수 있습니다.

"@"문자 가 한 번 발생할 때 Delete 하위 문자열 에서 찾은 정규 표현식의 변형을 사용하여 한 번만 발생하면 python 에서 행이 두 번이 아닌 "@"문자를 제거 했습니다 .

@(?!@)(?<!@@)

출력을보십시오 :

>>> s = "hello @jon i am @@here or @@@there and want some@thing in '@here"
>>> re.sub(r'@(?!@)(?<!@@)', '', s)
"hello jon i am @@here or @@@there and want something in 'here"

따라서 다음 단계는 "@"이 두 번 이상 발생할 때 바꾸는 것입니다. s.replace('@@', '@')"@"가 다시 발생 하는 위치 에서 제거하면 쉽게 수행 할 수 있습니다.

그러나 나는 한 번 에이 교체를 수행 할 수있는 방법이 있습니까?


1
정규식 답변이 필요합니까?
Sayandip Dutta

원칙적으로 @SayandipDutta는, 그래,하지만 난 : 정규식없이 동일 할 수있는 다른 방법 볼 수도 호기심 것
'SO 정지 해치지'fedorqui을

: 그냥 같은 문자열이있을 수 있는지 확인하는 @Hello@There경우 @연속되지 않을 것?
JvdV

1
@JvdV 아니오, 그런 경우는 없습니다.
fedorqui 'SO 중지 피해'

답변:


51

다음 패턴에서 정규식 교체를 수행합니다.

@(@*)

그런 다음 첫 번째 캡처 그룹으로 바꾸십시오. 첫 번째 캡처 그룹은 모두 연속적인 @ 기호에서 1을 뺀 것입니다.

이것은 @문자열의 시작, 중간 또는 끝에서 해당 단어가 될 때마다 각 단어의 시작 부분에서 발생하는 모든 항목을 캡처해야 합니다.

inp = "hello @jon i am @@here or @@@there and want some@thing in '@here"
out = re.sub(r"@(@*)", '\\1', inp)
print(out)

인쇄합니다 :

hello jon i am @here or @@there and want something in 'here

35

replace('@', '', 1)제너레이터 표현식에서 사용 하는 것은 어떻습니까?

string = 'hello @jon i am @@here or @@@there and want some@thing in "@here"'
result = ' '.join(s.replace('@', '', 1) for s in string.split(' '))

# output: hello jon i am @here or @@there and want something in "here"

int 값은 1선택적 count인수입니다.

str.replace(old, new[, count])

모든 하위 문자열 oldnew 로 교체 문자열의 복사본을 반환합니다 . 선택적 인수 개수 가 제공되면 첫 번째 개수 만 교체됩니다.


5
그것은 영리한 속임수입니다! replace의 세 번째 매개 변수는 replace(search, replace, max_matches)이므로 모든 단어의 첫 번째 매개 변수 만 바꿉니다.
fedorqui 'SO 중지 피해'

1
@ fedorqui'SOstopharming '그렇습니다.라는 count문서에서 설명을 추가했습니다.
남자

2
이 부작용에주의하십시오. 여백이 여러 개인 경우 ( '') 공백이 없어지고 단일 ''으로 대체됩니다.
Marc Vanhoomissen

4

다음 re.sub과 같이 사용할 수 있습니다 :

import re

s = "hello @jon i am @@here or @@@there and want some@thing in '@here"
s = re.sub('@(\w)', r'\1', s)
print(s)

결과는 다음과 같습니다.

"hello jon i am @here or @@there and want something in 'here"

그리고 여기에 개념 증명이 있습니다 :

>>> import re
>>> s = "hello @jon i am @@here or @@@there and want some@thing in '@here"
>>> re.sub('@(\w)', r'\1', s)
"hello jon i am @here or @@there and want something in 'here"
>>> 

2

마지막 문자 만 있고 @그것을 제거하고 싶지 않거나 특정 허용되는 시작 문자가있는 경우 다음을 생각해보십시오.

>>> ' '.join([s_.replace('@', '', 1) if s_[0] in ["'", "@"] else s_ for s_ in s.split()])
"hello jon i am @here or @@there and want some@thing in 'here"

또는 @처음 n자인 경우에만 바꾸려고한다고 가정하십시오.

>>> ' '.join([s_.replace('@', '', 1) if s_.find('@') in range(2) else s_ for s_ in s.split()])
"hello jon i am @here or @@there and want some@thing in 'here"

2

데모

(?<!@)@

당신은 이것을 시도 할 수 있습니다. 데모를 참조하십시오.


1
# Python3 program to remove the @ from String


def ExceptAtTheRate(string):
    # Split the String based on the space
    arrOfStr = string.split()

    # String to store the resultant String
    res = ""

    # Traverse the words and
    # remove the first @ From every word.
    for a in arrOfStr:
        if(a[0]=='@'):
            res += a[1:len(a)] + " "
        else:
            res += a[0:len(a)] + " "

    return res


# Driver code
string = "hello @jon i am @@here or @@@there and want some@thing in '@here"

print(ExceptAtTheRate(string))

산출:

여기에 이미지 설명을 입력하십시오


감사! 참고 그 @일부 @ 것 '@here은 또한 나의 요구 사항에 따라, 제거해야합니다.
fedorqui 'SO 중지 피해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.