正则表达式可以提取我需要的数据?

时间:2017-07-06 15:15:11

标签: python regex

我有一个字符串

url = '//item.taobao.com/item.htm?id\u003d528341191030\u0026ns\u003d1\u0026abbucket\u003d0#detail'

我想提取前两个528341191030之间的数字\u。我试过这个,

m = re.search('\?id\u\d+d(\d+?)\u', url)
if m:
  print m.group(1)

但它不起作用。我的解决方案出了什么问题?

3 个答案:

答案 0 :(得分:4)

您确定需要正则表达式吗? 以下是使用split的解决方案:

url.split("\u")[1].split("d")[-1]
'528341191030'

就你的正则表达式有什么问题而言," \"是一个特殊的角色,所以你应该使用" \\"反斜杠(所以" \\\ u"而不是" \ u"):

m = re.search('\?id\\\u\d+d(\d+?)\\\u', url)
if m:
  print m.group(1)

捐赠:528341191030

Docs

  

正则表达式使用反斜杠字符(' \')来表示   特殊形式或允许使用特殊字符   唤起他们的特殊意义。这与Python的使用相冲突   字符串文字中用于相同目的的相同字符;对于   例如,为了匹配文字反斜杠,可能需要编写' \\'   作为模式字符串,因为正则表达式必须是\,和   每个反斜杠必须表示为常规Python字符串中的\   文字。

或者,使用 Raw String Notation

m = re.search(r"\?id\\u\d+d(\d+?)\\u", url)
if m:
    print m.group(1)

答案 1 :(得分:0)

嗯,你总是可以尝试这个(不是超级优雅但有效):

first = url.find('\u') + 2
prev = 'u'
m = ""
for i in range(first, len(url)):
    if prev == '\' and url[i] == 'u':
         break
    else:
        m += url[i]
    if url[i] == 'd':
        m = ""

答案 2 :(得分:0)

更好的方法是分析并获取查询字符串值

url = '//item.taobao.com/item.htm?id\u003d528341191030\u0026ns\u003d1\u0026abbucket\u003d0#detail'
import urllib.parse as urlparse
print ( urlparse.parse_qs(urlparse.urlparse(url).query) )
print ( urlparse.parse_qs(urlparse.urlparse(url).query)['id'] )

输出:

{'id': ['528341191030'], 'ns': ['1'], 'abbucket': ['0']}
['528341191030']