이것은 아직까지 완전히 해결책이 아닙니다. 그것은 단지 반복 닫는 문자를 앞입니다 (예를 들어
))
,]]
,}}
). 동봉 된 내용을 캡처하는 방법을 찾고 있으며이를 업데이트 할 것입니다.
암호:
>>> import re
>>> re.search(r'(\(.+?[?<!)]\))', '((x(y)z))', re.DOTALL).groups()
('((x(y)z))',)
세부:
r'(\(.+?[?<!)]\))'
()
-그룹 특수 문자 캡처.\(
와 \)
- 개방형 및 폐쇄 문자 (예를 들어 '
, "
, ()
, {}
, []
).+?
- 모든 문자 내용과 일치 ( re.DOTALL
플래그 와 함께 사용 )[?<!)]
-문자에 대한 부정적 룩 비하인드 )
(이를 일치하는 닫는 문자로 대체). 이것은 기본적으로 문자가 앞에 있지 않은 모든 )
문자를 찾습니다 \)
(자세한 내용은 여기 ).나는 인터프리터 / 컴파일러의 기본 논리를 얻으려고 노력하면서 내가 함께 일하고있는이 렉서에 대한 변수 할당 문과 같은 것을 구문 분석하려고했습니다.
다음은 내가 다루는 기본 할당 문과 리터럴입니다.
az = none
az_ = true
az09 = false
az09_ = +0.9
az_09 = 'az09_'
_az09 = "az09_"
_az = [
"az",
0.9
]
_09 = {
0: az
1: 0.9
}
_ = (
true
)
어떻게 든, 내가 좋아하는 그 간단한 과제 구문 분석 관리 none
, true
, false
, 및 숫자 리터럴. 내가 현재 갇힌 곳은 다음과 같습니다.
import sys
import re
# validate command-line arguments
if (len(sys.argv) != 2): raise ValueError('usage: parse <script>')
# parse the variable name and its value
def handle_assignment(index, source):
# TODO: handle quotations, brackets, braces, and parenthesis values
variable = re.search(r'[\S\D]([\w]+)\s+?=\s+?(none|true|false|[-+]?\d+\.?\d+|[\'\"].*[\'\"])', source[index:])
if variable is not None:
print('{}={}'.format(variable.group(1), variable.group(2)))
index += source[index:].index(variable.group(2))
return index
# parse through the source element by element
with open(sys.argv[1]) as file:
source = file.read()
index = 0
while index < len(source):
# checks if the line matches a variable assignment statement
if re.match(r'[\S\D][\w]+\s+?=', source[index:]):
index = handle_assignment(index, source)
index += 1
동봉 된 따옴표, 대괄호, 중괄호 및 괄호로 이러한 값을 캡처하는 방법을 찾고있었습니다.
아마도 답변을 찾으면이 게시물을 업데이트 할 것입니다.
일치하는 각 쌍에 대해 여러 대안이있는 정규식을 사용하십시오.
re.match(r'\'.*?\'|".*?"|\(.*?\)|\[.*?\]|\{.*?\}', s)
그러나 중첩 된 대괄호가있는 경우 첫 번째 끝 대괄호와 일치합니다. 예를 들어 입력이
(words (and some more words))
결과는
(words (and some more words)
정규식은 중첩 된 구조를 일치시키는 데 적합하지 않으므로보다 강력한 구문 분석 기술을 사용해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다