正则表达式 - 部分匹配

时间:2016-02-14 20:30:38

标签: python regex

我的目标是在文本中找到并不总是存在所有匹配项的匹配项。

我正在尝试从网站上收集电话号码,电子邮件和场地网站。只有一些场地可以获得所有三种信息,但大多数只有一两个。我试着写一个代码。但是,仅当所有3个信息都可用时,它才有效。有人可以帮我解决什么问题吗?

grouped = re.compile('col-right[\s\S]*?' +
                     'Tel[\s\S]*?([0-9]{0,4}-?[0-9]{3,7}-?[0-9]{0,4}-?[0-9]{0,4})' +
                     '[\s\S]*?href="http://([\w\W]*?)"' +
                     '[\s\S]*?href="mailto:([\s\S]*?)">[\s\S]*?</div>')
for match in re.finditer(grouped, text):
    print (match.group(1))
    print (match.group(2))
    print (match.group(3))

电话号码中的数字也用“ - ”分隔,但有时在“ - ”和下一组数字之间有一个空格。如何在代码中包含仅偶尔出现此空间的内容?

1 个答案:

答案 0 :(得分:0)

你的逻辑很好,但需要一点工作。

首先,您需要电话号码。为它写一个正则表达式,并将其添加到一个组:var obj = [{tag: 'ft001', addr: 'DB415.DBD2'}, {tag: 'ft001', addr: 'DB415.DBD6'}]; function extractKey(arr, keyName) { return arr.map(x=> x[keyName]) } 该组标有(regex)*(``)表示它必须存在0次或更多次。

撰写下一个正则表达式,将其添加到另一个组*和第三个组(emailRegex)*

而不是(website)*您也可以使用*,一次或根本不使用(我可以看到,您使用了?

现在,把它们放在一起,只需将它们与它们之间的任何角色混合

?

grup1匹配电话号码,后跟任何字符,电子邮件,后跟任何字符,网站。如果其中一个缺失,则完全没有问题。

电子邮件正则表达式示例:(可能不是最完整的一个)

(group1)?.*(emailRegex)?.*(website)*

这样的工作方式如下:电子邮件应以字母或下划线 _ 开头,后跟大写/小写,数字,下划线或点()后跟 @ 和字母后跟一个点(注意我使用([a-zA-Z_]+[a-zA-Z_.-0-9]*@[a-zA-Z0-9]\.[a-z]+])? 来逃避特殊的\.表示法,最后你添加了至少一个混合一封信。

适用于 email@mail.com

我将整个正则表达式放在括号中意味着它是一个组,它应该出现一次或根本不出现(因此any character)。在群组之间,您添加?,这意味着在电话号码/电子邮件/地址之间可以是任何字符。