2014-11-25 7 views
2

다음과 같이 포맷 된 파일로부터 문자열을 얻습니다. 내가 뭘하고 싶은데요 (x2, y2, z2]와 [x1, x2, x3] 사이의 x, y, z 방향의 차이를 나타내는 벡터를 (파이썬에서리스트로 저장하는) 생성하는 것입니다. 아래에 표시된 문자열.문자열에서 xyz 좌표 값을리스트로 추출합니다.

원하는 벡터 [x2, y2, z2]와 [x1, x2, x3]을 정수 목록으로 추출한 후에는이를 계산해야합니다. 내가 도움이 필요한 것은 아래 [x2, y2, z2] 및 [x1, x2, x3] 목록을 만드는 것입니다.

data = """x1=45 y1=74 z1=55 col1=[255, 255, 255] x2=46 y2=74 z2=55 col2=[255, 255, 255] 
x1=34 y1=12 z1=15 col1=[255, 255, 255] x2=35 y2=12 z2=15 col2=[255, 255, 255] 
x1=22 y1=33 z1=24 col1=[255, 255, 255] x2=23 y2=33 z2=24 col2=[255, 255, 255] 
x1=16 y1=45 z1=58 col1=[255, 255, 255] x2=17 y2=45 z2=58 col2=[255, 255, 255] 
x1=27 y1=66 z1=21 col1=[255, 255, 255] x2=28 y2=66 z2=21 col2=[255, 255, 255] 
""" 

그냥 난 단지 한 줄의 [X2, Y2, Z2] 및 [X1, X2, X3] 목록을 추출하는 방법을 알아낼 필요가 분명히있다. 각 줄마다 루프를 만들고 각 줄마다 차이 벡터를 계산하는 방법을 알아낼 수 있습니다. 각 줄에서 관련 데이터를 추출하고 그것을 나를 혼란스럽게 만든 사용 가능한 형식으로 다시 포맷합니다.

정규 표현식을 사용하면이 정보를 추출 할 수있는 가능성이 있다고 생각합니다. 나는 https://docs.python.org/2/library/re.html에있는 문서를보고 그 문서에 완전히 당혹스럽고 혼란 스럽다. 나는 그것을 이해하기 쉬운 방법을 원한다.

+0

난 당신이 내가 어떤 더 추가를 참조하십시오 해달라고 ... 난 여분의 태그를 추가 할 수있을 것 해달라고 실제로 그렇게 – ronrest

+0

감사 태그 정규식을 추가 할 것을 제안 할 수 태그 단추 또는 그 자연의 아무것도. 그것은 내가 StackOverflow에 익숙하지 않기 때문에 그런가요? – fleman

+0

할 것입니다이 게시물에 – fleman

답변

2

내가 어디에서 왔는지 정확히 알고 있습니다. 나는 어제까지 정규 표현식을 이해하지 못했습니다. 그들은 항상 저를 혼란스럽게 만들었습니다. 그러나 일단 당신이 그들을 이해하면 얼마나 강력한 지 깨닫게됩니다. 문제 해결 방법은 다음과 같습니다. 또한 정규 표현식 뒤에있는 약간의 직관을 제공하여 정규 표현식의 혼란을 줄 이도록합니다.

아래 코드에서 한 번에 한 줄을 다루고 있으며 데이터는 항상 같은 형식으로되어 있습니다.

# Example of just one line of the data 
line = """x1=45 y1=74 z1=55 col1=[255, 255, 255] x2=46 y2=74 z2=55 col2=[255, 255, 255] """ 

# Extract the relevant x1, y1, z1 values, stored as a list of strings 
p1 = re.findall(r"[x-z][1]=([\d]*)", line) 

# Extract the relevant x2, y2, z2 values, stored as a list of strings 
p2 = re.findall(r"[x-z][2]=([\d]*)", line) 

# Convert the elements in each list from strings to integers 
p1 = [int(x) for x in p1] 
p2 = [int(x) for x in p2] 

# Calculate difference vector (Im assuming this is what you're trying to do) 
diff = [p2[i] - p1[i] for i in range(len(p2))] 

정규 표현식에서 어떤 기호에 대한 간략한 설명은 모든 라인이 동일한 형식을 가지고 assumming, 한 줄 들어

# EXPLANATION OF THE REGEX. 
# Finds segments of strings that: 
#  [x-z] start with a letter x,y, or z 
#  [1]  followed by the number 1 
#  =  followed by the equals sign 
# 
#  But dont return any of that section of the string, only use that 
#  information to then extract the following values that we do actually want 
# 
#  (  Return the parts of the string that have the following pattern, 
#    given that they were preceded by the previous pattern 
# 
#  [\d]  contain only a numeric digit 
#  *  keep proceeding forward if the current character is a digit 
# )  end of the pattern, now we can return the substring. 
+0

이것은 원하는 벡터 (목록) 형식으로 값을 멋지게 형식화합니다. Thsnks. 또한 정규 표현식에 대한 설명을 주셔서 감사합니다 ... 지금은 좀 더 이해가됩니다 ...하지만 난 아직도 내 스스로 사용하는 방법을 몰라. – fleman

+0

이 하우투 문서는 공식 문서 https://docs.python.org/2/howto/regex.html#regex-howto – ronrest

+0

보다 약간 이해하기 쉽습니다. 또한이 웹 페이지는 정규 표현식 http : //를 테스트 할 때 편리합니다. /regex101.com/ – ronrest

3

을하고있다, 당신은 할 수 있습니다 :

import re 

a_line = "x1=45 y1=74 z1=55 col1=[255, 255, 255] x2=46 y2=74 z2=55 col2=[255, 255, 255]" 
x1,y1,z1,x2,y2,z2 = list(map(int, re.findall(r'=(\d+)', a_line))) 

데이터에서 다중 선을 처리하려면 다음을 수행하십시오.

for a_line in data.split("\n"):  
    if a_line: 
     x1,y1,z1,x2,y2,z2 = list(map(int, re.findall(r'=(\d+)', a_line))) 
     print(x1,y1,z1,x2,y2,z2) 
,451,515,

을 제공합니다 :

45 74 55 46 74 55 
34 12 15 35 12 15 
22 33 24 23 33 24 
16 45 58 17 45 58 
27 66 21 28 66 21 
+0

안녕하세요, 고마워요. 정말 멋집니다. 앞으로도 나 자신을 확실히 활용할 수있을 것입니다. 약간 색이 아닌 좌표 만 추출하는 방법에 대해 조금 혼란스러워합니다. – ronrest

+0

이것은 나를 위해 일하고, 나는 목록으로 x1, x2, x3 등을 다시 포맷 할 수 있습니다. – fleman

+0

오, 이제 알았습니다 ... "="때문에 .... 그 모든 다른 것들은 제가 솔루션에 넣었습니다. 중복되었다. – ronrest

관련 문제