programing

줄의 왼쪽 부분을 제거하는 방법은 무엇입니까?

newstyles 2023. 7. 18. 21:35

줄의 왼쪽 부분을 제거하는 방법은 무엇입니까?

나는 파일에서 문자열을 검색하는 간단한 파이썬 코드를 가지고 있습니다. path=c:\pathc:\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=?

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

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

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

아니면 처음에 라인을 분할할 수 있습니다.=:

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

그런 다음 매개변수는 "Path"이고 값은 첫 번째 = 이후의 나머지 값입니다.

문자열에서 접두사 제거

# ...
if line.startswith(prefix):
   return line[len(prefix):]

의 첫 시 분할은 다음과 같습니다.str.partition()

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

ConfigParser를 사용하여 INI와 유사한 파일 구문 분석

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

기타 옵션

에서 시작Python 3.9사용할 수 있습니다.

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

파이썬 3.9+

text.removeprefix(prefix)

모든 Python 버전:

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

일반적으로 슬라이싱(조건부 또는 조건부)의 경우 최근 동료가 제안한 것을 선호합니다. 빈 문자열로 대체합니다.코드를 읽기 쉽고 코드(때로는)가 적으며 문자 수를 잘못 지정할 위험이 적습니다.알겠습니다. 저는 파이썬을 사용하지 않지만 다른 언어에서는 이러한 접근 방식을 선호합니다.

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

또는 - 이 게시물의 첫 번째 주석에 대한 후속 조치 - 이 다음으로 시작하는 경우에만 수행해야 하는 경우Path:

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

중 큰 은 '숫자관련되어 있지 '마법의 숫자'(5)와'마법의 숫자'를 둘 다 입니다.5그리고 문자열 'Path=즉, 코드 유지 관리의 관점에서 이러한 접근 방식을 선호합니다.

선호합니다pop색인을 [-1]:

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

로.

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

아니면 왜 안됩니까?

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

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

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_index그리고.last_index를 포함하여, 을 포함하여first_index그리고 아닌last_index첫 번째 인덱스가 생략되면 기본적으로 시퀀스의 시작이 됩니다.마지막 인덱스를 생략하면 시퀀스의 마지막 요소까지 모든 요소가 포함됩니다.음수 인덱스도 허용됩니다.Google을 사용하여 항목에 대해 자세히 알아보십시오.

여기서 언급되지 않은 또 다른 간단한 원라이너:

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

그럼..

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

출력:

('', 'path=', 'c:\\path')

이 세쌍둥이는 머리, 분리기, 꼬리입니다.

import re

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

path = r"path=c:\path"

re.match(p, path).group(1)

출력:

'c:\\path'
line[5:]

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

removeprefix()그리고.removesuffix()문자열 메서드는 관련 문제로 인해 Python 3.9에 추가되었습니다.lstrip그리고.rstrip전달된 매개 변수의 해석.자세한 내용은 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']

line[5:]당신이 원하는 부분 문자열을 줄 것입니다.서론을 검색하고 '슬라이스 표기법'을 찾습니다.

regex를 이스케이프와 함께 사용하면 어떨까요? ^라인의 초기 부분과 일치합니다.re.MULTILINE각 라인에 일치하는 항목. re.escape정확한 일치를 보장합니다.

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

목록 이해도를 알고 있는 경우:

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

다음 코드를 따라 해보십시오.

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

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

    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

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

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

다음 방법을 시도할 수 있습니다.

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)

이는 다른 답변과 매우 유사하지만 반복적인 문자열 작업 없이 접두사가 있는지 여부를 구분할 수 있으며 여전히 읽을 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/599953/how-to-remove-the-left-part-of-a-string