简体   繁体   中英

How to print substring using RegEx in Python?

This is two texts:

1) 'provider:sipoutilp1.ym.ms' 
2) 'provider:sipoutqtm.ym.ms'

I would like to print ilp when reaches to the fist line and qtm when reaches to the second line.

This is my solution but it is not working.

RE_PROVIDER = re.compile(r'(?P<provider>\((ilp+|qtm+)')

or in the line below,

182938,DOMINICAN REPUBLIC-MOBILE

to DOMINICAN REPUBLIC , can I use the same approach re.compile ?

Thank you for any help.

Your regex is not correct because you have a open parenthesis before your keywords, since there is no such character in your lines.

As a more general way you can get capture the alphabetical character after sipout or provider:sipout .

>>> s1 = 'provider:sipoutilp1.ym.ms'
>>> s2 = 'provider:sipoutqtm.ym.ms'
>>> RE_PROVIDER = re.compile(r'(?P<provider>(?<=sipout)(ilp|qtm))')
>>> RE_PROVIDER.search(s1).groupdict()
{'provider': 'ilp'}
>>> RE_PROVIDER.search(s2).groupdict()
{'provider': 'qtm'}

(?<=sipout) is a positive look-behind which will makes the regex engine match the patter which is precede with sipout .

After edit:

If you want to match multiple strings with different structure, you have to use a optional preceding patterns for matching your keywords, and due to this point that you cannot use unfixed length patterns within look-behind you cannot use it for this aim. So instead you can use a capture group trick.

You can define the optional preceding patterns within a none capture group and your keyword within a capture group then after match get the second matched gorup ( group(1) , group(0) is the whole of your match).

>>> RE_PROVIDER = re.compile(r'(?:sipout|\d+,)(?P<provider>(ilp|qtm|[A-Z\s]+))')
>>> RE_PROVIDER.search(s1).groupdict()
{'provider': 'ilp'}
>>> RE_PROVIDER.search(s2).groupdict()
{'provider': 'qtm'}
>>> s3 = "182938,DOMINICAN REPUBLIC-MOBILE"
>>> RE_PROVIDER.search(s3).groupdict()
{'provider': 'DOMINICAN REPUBLIC'}

Note that gorupdict doesn't works in this case because it will returns

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM