개발/Python

[파이썬] 문자열의 왼쪽 부분을 제거하는 방법은 무엇입니까?

MinorMan 2021. 2. 7. 07:50
반응형

<질문>

파일에서 문자열을 검색하는 간단한 파이썬 코드가 있습니다.path=c:\path, 어디서c:\path부분은 다를 수 있습니다. 현재 코드는 다음과 같습니다.

def find_path(i_file):
    lines = open(i_file).readlines()
    for line in lines:
        if line.startswith("Path="):
            return # what to do here in order to get line content after "Path=" ?

텍스트를 얻는 간단한 방법은 무엇입니까Path=?


<답변1>

시작Python 3.9, 당신이 사용할 수있는removeprefix:

'Path=helloworld'.removeprefix('Path=')
# 'helloworld'

<답변2>

문자열이 고정 된 경우 다음을 사용할 수 있습니다.

if line.startswith("Path="):
    return line[5:]

이것은 문자열의 위치 5부터 모든 것을 제공합니다 (문자열도 시퀀스이므로 이러한 시퀀스 연산자도 여기서 작동합니다).

또는 처음에 선을 분할 할 수 있습니다.=:

if "=" in line:
    param, value = line.split("=",1)

그런 다음 param은 "Path"이고 value는 첫 번째 = 이후의 나머지입니다.


<답변3>

# ...
if line.startswith(prefix):
   return line[len(prefix):]
def findvar(filename, varname="Path", sep="=") :
    for line in open(filename):
        if line.startswith(varname + sep):
           head, sep_, tail = line.partition(sep) # instead of `str.split()`
           assert head == varname
           assert sep_ == sep
           return tail
from ConfigParser import SafeConfigParser
config = SafeConfigParser()
config.read(filename) # requires section headers to be present

path = config.get(section, 'path', raw=1) # case-insensitive, no interpolation

<답변4>

def remove_prefix(text, prefix):
    return text[len(prefix):] if text.startswith(prefix) else text

<답변5>

슬라이싱 (조건부 또는 비 조건부)의 경우 일반적으로 동료가 최근 제안한 것을 선호합니다. 빈 문자열로 대체를 사용하십시오. 코드를 더 쉽게 읽을 수 있고 코드가 적고 (때때로) 잘못된 문자 수를 지정할 위험이 줄어 듭니다. 확인; 저는 Python을 사용하지 않지만 다른 언어에서는이 방법을 선호합니다.

rightmost = full_path.replace('Path=', '', 1)

또는-이 게시물에 대한 첫 번째 댓글에 대한 후속 조치-이 작업 만 수행해야하는 경우줄이 시작되면Path:

rightmost = re.compile('^Path=').sub('', full_path)

위에서 제안 된 것 중 일부와의 주요 차이점은 관련된 "매직 넘버"(5)가 없으며 둘 다 지정할 필요가 없다는 것입니다.5'문자열 'Path=즉, 코드 유지 관리 관점에서이 접근 방식을 선호합니다.


<답변6>

나는 선호한다pop인덱싱[-1]:

value = line.split("Path=", 1).pop()

...에

value = line.split("Path=", 1)[1]
param, value = line.split("Path=", 1)

<답변7>

아니면 왜 안돼

if line.startswith(prefix):
    return line.replace(prefix, '', 1)

<답변8>

어때 ..

>>> line = r'path=c:\path'
>>> line.partition('path=')
('', 'path=', 'c:\\path')

이 삼중 항은head, separator, and tail.


<답변9>

제가 생각할 수있는 가장 간단한 방법은 슬라이싱입니다.

def find_path(i_file): 
    lines = open(i_file).readlines() 
    for line in lines: 
        if line.startswith("Path=") : 
            return line[5:]

슬라이스 표기법에 대한 빠른 참고는 일반적인 인덱스 대신 두 개의 인덱스를 사용합니다. 첫 번째 인덱스는 시퀀스에 포함하려는 시퀀스의 첫 번째 요소를 나타냅니다.일부분마지막 인덱스는 슬라이스에 포함하려는 마지막 요소 바로 뒤의 인덱스입니다.
예 :

sequence_obj[first_index:last_index]

슬라이스는first_indexlast_index, 포함first_index그리고 아닙니다last_index. 첫 번째 색인이 생략되면 기본적으로 시퀀스의 시작이됩니다. 마지막 인덱스가 생략되면 시퀀스의 마지막 요소까지 모든 요소가 포함됩니다. 음수 인덱스도 허용됩니다. 주제에 대해 자세히 알아 보려면 Google을 사용하세요.


<답변10>

>>> import re

>>> p = re.compile(r'path=(.*)', re.IGNORECASE)

>>> path = "path=c:\path"

>>> re.match(p, path).group(1)
'c:\\path'

<답변11>

line[5:]

처음 5 개 이후의 문자를 제공합니다.


<답변12>

여기에 언급되지 않은 또 다른 간단한 한 줄 :

value = line.split("Path=", 1)[-1]

이는 다양한 엣지 케이스에서도 제대로 작동합니다.

>>> print("prefixfoobar".split("foo", 1)[-1])
"bar"

>>> print("foofoobar".split("foo", 1)[-1])
"foobar"

>>> print("foobar".split("foo", 1)[-1])
"bar"

>>> print("bar".split("foo", 1)[-1])
"bar"

>>> print("".split("foo", 1)[-1])
""

<답변13>

line[5:]원하는 부분 문자열을 제공합니다. 검색introduction'슬라이스 표기법'을 찾습니다.


<답변14>

목록 이해력을 알고있는 경우 :

lines = [line[5:] for line in file.readlines() if line[:5] == "Path="]

<답변15>

이스케이프와 함께 정규식을 사용하지 않는 이유는 무엇입니까?^줄의 처음 부분과 일치하고re.MULTILINE각 줄에서 일치합니다.re.escape일치가 정확한지 확인합니다.

>>> print(re.sub('^' + re.escape('path='), repl='', string='path=c:\path\nd:\path2', flags=re.MULTILINE))
c:\path
d:\path2

<답변16>

다음 코드 시도

if line.startswith("Path="): return line[5:]

<답변17>

removeprefix()removesuffix()추가 된 문자열 메서드파이썬 3.9관련된 문제로 인해lstriprstrip전달 된 매개 변수의 해석. 읽다PEP 616상세 사항은.

# in python 3.9
>>> s = 'python_390a6'

# apply removeprefix()
>>> s.removeprefix('python_')
'390a6'

# apply removesuffix()
>>> s = 'python.exe'
>>> s.removesuffix('.exe')
'python'

# in python 3.8 or before
>>> s = 'python_390a6'
>>> s.lstrip('python_')
'390a6'

>>> s = 'python.exe'
>>> s.rstrip('.exe')
'python'

removesuffix목록이있는 예 :

plurals = ['cars', 'phones', 'stars', 'books']
suffix = 's'

for plural in plurals:
    print(plural.removesuffix(suffix))

산출:

car
phone
star
book

removeprefix목록이있는 예 :

places = ['New York', 'New Zealand', 'New Delhi', 'New Now']

shortened = [place.removeprefix('New ') for place in places]
print(shortened)

산출:

['York', 'Zealand', 'Delhi', 'Now']

<답변18>

팝 버전이 옳지 않았습니다. 나는 당신이 원한다고 생각합니다 :

>>> print('foofoobar'.split('foo', 1).pop())
foobar

<답변19>

당신이 정확히 찾고있는 것 같아요

    def findPath(i_file) :
        lines = open( i_file ).readlines()
        for line in lines :
            if line.startswith( "Path=" ):
                output_line=line[(line.find("Path=")+len("Path=")):]
                return output_line

<답변20>

함수를 작성할 필요없이 목록에 따라 분할됩니다.이 경우에는 'Mr. | Dr. | Mrs.', 분할 후 모든 항목을 [1]로 선택한 다음 다시 분할하여 원하는 요소를 가져옵니다. 아래의 경우 '모리스'가 반환됩니다.

re.split('Mr.|Dr.|Mrs.', 'Mr. Morgan Morris')[1].split()[1]

<답변21>

이것은 다른 답변과 매우 유사하지만 반복되는 문자열 작업이 없으며 접두사가 있는지 여부를 알 수 있으며 여전히 읽기 쉽습니다.

parts = the_string.split(prefix_to_remove, 1):
    if len(parts) == 2:
        #  do things with parts[1]
        pass

<답변22>

아래 방법을 시도해 볼 수 있습니다.

def remove_suffix(string1, suffix):
    length = len(suffix)

    if string1[0:length] == suffix:
        return string1[length:]
    else:
        return string1

suffix = "hello"
string1 = "hello world"

final_string = remove_suffix(string1, suffix)
print (final_string)
반응형