正则表达式匹配的正则表达式匹配字符串返回无

时间:2019-01-05 17:02:41

标签: python regex python-3.x

我正在为subreddit做一个小型机器人。为此,我从trakt.tv中删除了一些数据。报废后,我在上面运行了一个正则表达式

obituarySecondary = re.match(r"^([\w \,\.\"]+, \d{4} ?- ?\w+ \d+, ?\d{4})", obituaryRaw).group(0)

我得到了符合要求的结果,Nathaniel Fisher, Sr.1943-2000

现在我在obituarySecondary上运行了另一个正则表达式

timeline = "\n\n" + re.match(r'(\d{4} ?- ?\d{4})', obituarySecondary).group(0)

但这总是返回None

我在https://regex101.com/上运行了相同的正则表达式,以确保我做的正确,并且字符串匹配,但在我的系统上不匹配。

2 个答案:

答案 0 :(得分:4)

function rolesFlattener(obj) { let final = {}; Object.keys(obj).forEach((item, index) => { const path = item.split('_'); if(path.length > 1) { path.reduce((prev, current, i, array) => { if(!final[prev]) { final[prev] = { status: 'limited', subOptions: {} } } final[prev].subOptions[current] = true; return current; }); } else { final[path[0]] = { status: 'full' } } }) console.log(final) } // userRole: { // home: { // status: 'full' // }, // products: { // status: 'limited', // subOptions: { // edit: true, // create: true // } // }, // orders: { // status: 'limited', // subOptions: { // delete: true, // } // }, // pages: { // status: 'limited', // subOptions: { // category: { // status: 'limited', // subOptions: { // create: true, // } // }, // } // } // } let sampleObj = { home: true, products_edit: true, products_create: true, orders_delete: true, pages_category_create: true } rolesFlattener(sampleObj)仅搜索字符串中的第一项,而使用re.match()

查看this StackOverflow问题以获取更多详细信息

答案 1 :(得分:2)

这是因为re.match()仅匹配字符串的开头,而不匹配每行的开头。

re.match()的Python文档指出

  

如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。如果字符串与模式不匹配,则返回None;请注意,这与零长度匹配不同。

     

请注意,即使在MULTILINE模式下,re.match()也只会在字符串的开头而不是在每一行的开头匹配。

     

如果要在字符串中的任意位置找到匹配项,请改用search()

现在,如果我们比较match()search()

基于正则表达式有两种原始操作:

  1. re.match():仅在字符串开头检查匹配项
  2. re.search():哪个检查字符串中任何位置的匹配项。

例如:

>>> re.match("Fisher", "The Fisher Man")    # No match
>>> re.search("Fisher", "The Fisher Man")   # Match
<re.Match object; span=(4, 10), match='Fisher'>

最好使用search()限制字符串开头的匹配,您可以使用以'^'开头的正则表达式:

>>> re.match("Fisher", "The Fisher Man")    # No match
>>> re.search("^Fisher", "The Fisher Man")  # No match
>>> re.search("^The", "The Fisher Man")  # Match
<re.Match object; span=(0, 3), match='The'>

MULTILINE模式

在多行模式下,match()仅在字符串的开头匹配,而将search()与以'^'开头的正则表达式结合使用将在每行的开头< / strong>。

>>> para = "Hello How are you?\nHope you are doing Good!\nSee you in the evening."
>>> re.match('Hope', para, re.MULTILINE)  # No match
>>> re.search('^Hope', para, re.MULTILINE)  # Match
<re.Match object; span=(19, 23), match='Hope'>