2014-09-09 3 views
-1

일부 코드를 Perl에서 Python으로 변환하려고했습니다. 필자는 Perl을 배운 적이 없기 때문에 Perl에서 사용 된 정규 표현식을 이해하는 데 문제가 있습니다.Perl에서 Python으로 변환 문제 : Regex 해석

아무도 나를 아래 코드 줄을 이해하는 데 도움이 될 수 있습니까?

$seqfile =~ /(\S+)\.txt/ 

******** 새로운 질문 : ************ 아래

는 변수의 이름은 '그와 관련된 문자열 값을가집니다. 어떻게 해시 변수 (hash_lib)의 값이 정수 값인 것처럼 다음 라인을 업데이트 (++ 사용)할까요? 해시 인 경우 왜 해시 변수를 선언 할 때 '%'를 사용하지 않습니까? '$'를 사용하여 해시를 만들 수 있습니까?

$hash_lib{$name}++; 

또 다른 것은 하나의 값에 대해 두 개의 키로 해시를 만들 수 있습니까? 그렇다면 다음과 같은 파이썬이 무엇이겠습니까?

$hash_abun{$name}{$seq}= $abun; 
+0

변수'$ 1'에'/ .txt /'앞에 오는 공백이 아닌 문자를 저장합니다 (점은 임의의 문자). – ajwood

+0

감사합니다. 그건 의미가 있습니다. –

+1

질문을 편집하기 전에 백 슬래시가 표시되지 않았습니다. 그것은 와일드 카드가 아니라 문자 그대로의 마침표'.'를 의미합니다. 전체 정규식은 확장명이'txt' 인 파일 이름의 기본 이름을 캡처하려는 시도처럼 보입니다. – TLP

답변

1
/(\S+)\.txt/ 
#  ^^^^^--- file extension? 
# ^^^--------- file name? 

정규식은 하나 이상의 공백이 아닌 문자 \S+의 문자열과 일치합니다. 아마도 파일 이름 뒤에 리터럴 문자열 .txt이 붙어 있습니다. 아마도 파일 확장자 일 것입니다. 이 파일 이름은 변수 $1으로 캡처됩니다 (목록 컨텍스트 인 경우 표현식에서도 반환됩니다). 일반적으로이 표현식은 문자열을 캡처 아래와 같이 사용한다 :

my $basename; 
... 
if ($seqfile =~ /(\S+)\.txt/) { 
    $basename = $1; 
} 

또는

이 가능성이 일반 텍스트 파일의 기본 이름을 캡처하는 방법입니다
my ($basename) = $seqfile =~ /(\S+)\.txt/ 

. 그러한 일을하는 더 좋은 방법은 File::Basename qw(basename)을 사용하는 것입니다. 하지만 Perl에서 Python으로의 변환에는 관련이 없습니다.

+1

위대한 설명! 감사합니다. –

+0

당신을 진심으로 환영합니다. – TLP

0

\S === 비 공백 문자

+ ==== 1

(``) 더 === 그룹 1

. ===== 모든 문자

txt === txt

+0

그 코드 행에 대한 중요한 "펄 관련"메모는 일치하는 그룹이'$ 1'에 저장된다는 사실입니다. – ajwood