2015-02-04 2 views
0

자리 표시자를 포함하는 문자열이 있는데 그 자리 표시자를 추출하려고합니다.자리 표시 자 부분 문자열 찾기

예 :

q = re.compile(r'\%(\w+)%\]') 
p= q.findall(string) 

^그 그다지 일 " Hello %s, your balance is %d%%".

두 자리 표시자를 모두 추출 할 수있는 방법이 있습니까? 형식이 다른데도?

+0

이 자리 표시 자 '% s'과 (와)'% d '이 있습니까? –

+2

추출 할 항목이 무엇입니까? 왜 정규식에서'\]'를 사용 했습니까? –

+0

모든 선택적 placeholder 구성 요소는 어떻습니까? – jonrsharpe

답변

3
q = re.compile(r'%(\w+)%?') 

데모를 참조하십시오.

https://www.regex101.com/r/rC2mH4/11

Infact는 당신이 0 width assertion를 만들기 위해 % 당신에게 CNA 사용 lookaround을 싶지 않는 경우.

(?<=%)(\w+)%? 

데모를 참조하십시오.

https://www.regex101.com/r/rC2mH4/12

+0

문자열에서 's'와 'd'를 모두 추출하는 것이 효과적입니다. "% s"및 "% d %%"을 (를) 추출하려면 어떻게해야합니까? – user1322582

+0

@ user1322582 데모를 확인하십시오.이 두 가지 모두를 추출합니다. '%'도 사용 하시겠습니까? – vks

+0

예, 공백까지 모든 것이 필요합니다.이 방법은 잘 작동합니다 : (% \ w + \ S +)? – user1322582

0

당신은 template strings 좀보고 할 수 있습니다.

그럼 당신은 간단하게 작성할 수

from string import Template 
s = Template('Hello $name, your balance is $balance') 
print s.substitute(name='user1322582', balance=33) 
# output: Hello user1322582, your balance is 33 
0

The documentation는 "변환 사양"서식 문자열에 대한 옵션을 설명합니다;

>>> import re 
>>> s = " Hello %s, your balance is %d%%" 
>>> pattern = r''' 
    %       # start of specifier 
    (?P<key>\([^\)]*\))?   # optional mapping key 
    (?P<flags>[#0\- +])*   # optional conversion flags 
    (?P<width>\*|\d*)?   # optional minimum field width 
    (?P<precision>\.\*|\.\d*)? # optional precision 
    (?P<lenmod>[hlL])?   # optional length modifier 
    (?P<type>[diouxXeEfFgGcrs%]) # conversion type 
''' 
>>> [g.groupdict() for g in re.finditer(pattern, s, re.VERBOSE)] 
[{'precision': None, 'width': None, 'flags': None, 'key': None, 'lengthmod': None, 'type': 's'}, 
{'precision': None, 'width': None, 'flags': None, 'key': None, 'lengthmod': None, 'type': 'd'}, 
{'precision': None, 'width': None, 'flags': None, 'key': None, 'lengthmod': None, 'type': '%'}] 

참조 데모 here : 당신이 모든 것을해야하는 경우, 당신은 같은 것을 사용할 수 있습니다. 현재의 예제에서는 너무 잔인하지만 임의의 문자열을 처리하려는 경우에 필요합니다.