필자는 Perl 프로그래머로서 전에 해본 작업을 파이썬으로 변환하여 파이썬을 배우려고 시도하고 있습니다. 이것은 이 아니고 라인별로 번역됩니다. 이 유형의 작업을 수행하려면 Python Technique을 배우고 싶습니다.파이썬에서 행 파싱하기 : RE 또는 NOT을 사용 하시겠습니까?
Windows INI 파일을 구문 분석하고 있습니다. 섹션 이름은 형식으로되어 있습니다 :
[<type> <description>]
<type>
는 하나의 단어 필드이며 대소 문자를 구분하지 않습니다. <description>
은 여러 단어 일 수 있습니다.
섹션 뒤에는 많은 매개 변수와 값이 있습니다. 이들은 다음과 같은 형식입니다 :
<parameter> = <value>
매개 변수에는 공백이없고 밑줄, 문자 및 숫자 만 사용할 수 있습니다 (대소 문자 구분). 따라서 첫 번째 =
은 매개 변수와 값 사이의 구분자입니다. 등호 주위에 매개 변수와 값을 구분하는 공백이있을 수 있습니다. 행의 처음 또는 끝에 여분의 공백이있을 수 있습니다.
while (my $line = <CONTROL_FILE>) {
chomp($line);
next if ($line =~ /^\s*[#;']/); #Comments start with "#", ";", or "'"
next if ($line =~ /^\s*$/); #Ignore blank lines
if ($line =~ /^\s*\[\s*(\w+)\s+(.*)/) { #Section
say "This is a '$1' section called '$2'";
}
elsif ($line =~ /^\s*(\w+)\s*=\s*(.*)/) { #Parameter
say "Parameter is '$1' with a value of '$2'";
}
else { #Not Comment, Section, or Parameter
say "Invalid line";
}
}
문제는 내가 펄에 의해 손상 봤는데, 그래서 내가 뭔가를 할 수있는 가장 쉬운 방법은 정규 표현식을 사용하는 것입니다 생각 :
펄, 나는 파싱을위한 정규 표현식을 사용했다. 정규 표현식 그냥 사용 부르고 것으로 보인다
- 가 두 곳이 있습니다 : 여기 여기 나를 자극하는 몇 가지가 있습니다
for line in file_handle: line = line.strip # Comment lines and blank lines if line.find("#") == 1 \ or line.find(";") == 1 \ or line.whitespace: continue # Found a Section Heading if line.find("[") == 1: print "I want to use a regular expression here" print "to split the section up into two pieces" elif line.find("=") != -1: print "I want to use a regular expression here" print "to split the parameter into key and value" else print "Invalid Line"
내가 지금까지 가지고있는 코드는 ...입니다. 이 분할을 수행하는 Python의 방식은 무엇입니까?
- 문자열의 양쪽에 공백을 제거하고 문자열을 다시 작성해야합니다. 그렇게하면 여러 번 스트리핑을 할 필요가 없습니다. 그러나 필자가 이해하는 문자열은 Python에서 매우 비효율적 인 작업으로 다시 작성합니다. 이 문제를 처리 할 파이썬 방법은 무엇입니까?
- 결국, 내 알고리즘은 내 Perl 알고리즘과 매우 흡사하게 보입니다. 내 Perl을 생각하게 만드는 것 같습니다. 코드가 파이썬으로 어떻게 구성되어야합니까?
나는 다양한 온라인 튜토리얼을 통해 구문을 이해하는 데 도움이되었지만 언어 자체를 다루는 방법은별로 아니었다. 특히 다른 언어를 생각하는 경향이있는 사람 언어.
내 질문 :
- 내가 정규식을 사용 하는가? 아니면 이것을 처리 할 수있는 또 다른 방법이 있습니까?
- 코딩 논리가 맞습니까? 이 파일의 구문 분석을 어떻게 생각해야합니까?
['ConfigParser'] (http://docs.python.org/library/configparser.html) 모듈을 확인하십시오. –
Perl에서 당신은'부패하지 않습니다.'당신에게 축복을드립니다. – joaquin
@SvenMarnach - 당신의 제안에 감사드립니다. 그러나 나는 이미 그것을 보았습니다. 문제는 ConfigParser가 출력물을 사전에 집어 넣고이 특정 응용 프로그램에서 실제로 중요한 사전 섹션의 순서를 보장 할 수 없다는 것입니다. 필자는 Perl에서 [Config :: Ini] (http://search.cpan.org/~rjbs/Config-INI-0.019/lib/Config/INI.pm) 모듈과 동일한 문제가있었습니다. 게다가, 이것은 나에게 파이썬의 기능을 실제로 배울 수있는 기회를 제공한다. –