匹配所有内容直到可选字符串(Python正则表达式)

时间:2016-08-15 11:35:26

标签: python regex

我对这个问题嗤之以鼻,似乎我错过了一些非常微不足道的事情,所以提前道歉。我有一个网址,可能包含或不包含一些POST值。我想匹配整个网址UNTIL这个可选部分(不包括在内)。例如:

import re
myurl = r'http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41'
matchObj  =  re.match(r'(.*?)(&pageinfo=\d+){0,1}', myurl)
print matchObj.groups()
>> ('', None)

# Putting the non-greedy ? outside
matchObj  =  re.match(r'(.*)?(&pageinfo=\d+){0,1}', myurl)
print matchObj.groups()
>> ('http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41', None)

# The url might also be without the last part, that is
myurl = r'http://myAddress.com/index.aspx?cat=ThisPartChanges'
# I'd like the regex to capture the first part. "ThisPartChanges" might 
# be different every time

我想要的是获取所有内容,直到pageNum = \ d +,不包括在内。 那是

http://myAddress.com/index.aspx?cat=ThisPartChanges

我只对& pageNum之前的部分感兴趣,并且不关心它是否存在,只是想以某种方式过滤它以便我可以得到真正的地址,直到cat = ....

我尝试了各种非贪婪的杂技,但是让我失望的部分是第二部分是可选的,因此没有什么可以“锚定”非贪婪的比赛。 任何想法如何优雅地做到这一点?只有第一部分很重要。也欢迎非正则表达式解决方案

谢谢!

3 个答案:

答案 0 :(得分:3)

您可能需要查看https://docs.python.org/2/library/urlparse.html

参数传递的顺序可能会改变:

?pageNum=41&cat=ThisPartChanges

答案 1 :(得分:2)

我建议您在网址解析时避免使用正则表达式,而是使用此module,这是您的问题的一个有效示例:

import urlparse

myurl = 'http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41'

parsed = urlparse.urlparse(myurl)

print 'scheme  :', parsed.scheme
print 'netloc  :', parsed.netloc
print 'path    :', parsed.path
print 'params  :', parsed.params
print 'query   :', parsed.query
print 'fragment:', parsed.fragment
print 'username:', parsed.username
print 'password:', parsed.password
print 'hostname:', parsed.hostname, '(netloc in lower case)'
print 'port    :', parsed.port

print urlparse.parse_qs(parsed.query)

答案 2 :(得分:1)

在您的情况下,可以这样做:

^[^&]+

更强大:

^[^?]+\?cat=[^&]+

示例:

In [40]: s = 'http://myAddress.com/index.aspx?cat=ThisPartChanges&pageNum=41'

In [41]: re.search(r'^[^&]+', s).group()
Out[41]: 'http://myAddress.com/index.aspx?cat=ThisPartChanges'

In [42]: re.search(r'^[^?]+\?cat=[^&]+', s).group()
Out[42]: 'http://myAddress.com/index.aspx?cat=ThisPartChanges'