【问题标题】:php regex to python, preg_match($x,$y,$z) to re.search(x,y,z)php 正则表达式到 python,preg_match($x,$y,$z) 到 re.search(x,y,z)
【发布时间】:2016-05-15 17:55:29
【问题描述】:

先生。 Wiktor,这个问题绝不是您在将其标记为重复的理由中并列的问题的重复。 也就是说,您指出的问题是 python 中 preg_match 的计数部分是什么。我什至在标题本身中也提到了“re.search”,这是您提到的线程的答案。我知道re.search 我的问题特别是关于如何在 re.search 中使用第三个参数,就像在我提供的示例中使用它在 php 中的对应物一样。 Wiktor 先生,我恭敬地请求您取消将我的帖子标记为重复的内容,谢谢先生。

我正在尝试在 python 中为希腊语进行词干提取 (NLP)。 php代码是这样的:

protected static $step1list = array(
    "φαγια"=>"φα",
    "φαγιου"=>"φα",
    "φαγιων"=>"φα",
    "σκαγια"=>"σκα",
    "σκαγιου"=>"σκα",
    "σκαγιων"=>"σκα",
    "ολογιου"=>"ολο",
    "ολογια"=>"ολο",
    "ολογιων"=>"ολο",
    "σογιου"=>"σο",
    "σογια"=>"σο",
    "σογιων"=>"σο",
    "τατογια"=>"τατο",
    "τατογιου"=>"τατο",
    "τατογιων"=>"τατο",
    "κρεασ"=>"κρε",
    "κρεατοσ"=>"κρε",
    "κρεατα"=>"κρε",
    "κρεατων"=>"κρε",
    "περασ"=>"περ",
    "περατοσ"=>"περ",
    "περατα"=>"περ",
    "περατων"=>"περ",
    "τερασ"=>"τερ",
    "τερατοσ"=>"τερ",
    "τερατα"=>"τερ",
    "τερατων"=>"τερ",
    "φωσ"=>"φω",
    "φωτοσ"=>"φω",
    "φωτα"=>"φω",
    "φωτων"=>"φω",
    "καθεστωσ"=>"καθεστ",
    "καθεστωτοσ"=>"καθεστ",
    "καθεστωτα"=>"καθεστ",
    "καθεστωτων"=>"καθεστ",
    "γεγονοσ"=>"γεγον",
    "γεγονοτοσ"=>"γεγον",
    "γεγονοτα"=>"γεγον",
    "γεγονοτων"=>"γεγον"
);
protected static $step1regexp="/(.*)(φαγια|φαγιου|φαγιων|σκαγια|σκαγιου|σκαγιων|ολογιου|ολογια|ολογιων|σογιου|σογια|σογιων|τατογια|τατογιου|τατογιων|κρεασ|κρεατοσ|κρεατα|κρεατων|περασ|περατοσ|περατα|περατων|τερασ|τερατοσ|τερατα|τερατων|φωσ|φωτοσ|φωτα|φωτων|καθεστωσ|καθεστωτοσ|καθεστωτα|καθεστωτων|γεγονοσ|γεγονοτοσ|γεγονοτα|γεγονοτων)$/u";

$w;
$stem="";
$suffix="";
$firstch="";

if (preg_match($step1regexp, $w, $fp)) {
    $stem = $fp[1];
    $suffix = $fp[2];
    $w = $stem.$step1list[$suffix];
}

我最近尝试过的是这个(我没有在列表中添加 blah,它们与 php 相同):

import re

step1list = {
    u"φαγια": u"φα",
    blah blah blah blah
    }

stem = ""
suffix=""
firstch=""

s = u"σογια"
reg = re.compile(r'/(.*)(φαγια|φαγιου|φαγιων|σκαγια|σκαγιου|σκαγιων|ολογιου|ολογια|ολογιων|σογιου|σογια|σογιων|τατογια|τατογιου|τατογιων|κρεασ|κρεατοσ|κρεατα|κρεατων|περασ|περατοσ|περατα|περατων|τερασ|τερατοσ|τερατα|τερατων|φωσ|φωτοσ|φωτα|φωτων|καθεστωσ|καθεστωτοσ|καθεστωτα|καθεστωτων|γεγονοσ|γεγονοτοσ|γεγονοτα|γεγονοτων)$');
m = reg.search(s)
if m:
    stem = m.group(1);
    suffix = m.group(2);
    s = "{0}{1}".format(stem, step1list[suffix])
print(s)
print(stem)
print(suffix)

我得到的结果是:

σογια

(后面有2个空行)表示这2组没有被成功识别:(

我该如何解决这个问题?

【问题讨论】:

  • 只要尝试与re.search匹配,然后检查匹配对象是否不是None,然后访问匹配对象中的值。
  • 你到底是什么意思?据我所知,“re.search(re, w, fp)”返回一个布尔值,所以我不能做“Object = re.search(re, w, fp)”,因为我得到的只是一个对或错。您能否进一步解释一下您的意思?
  • Python re.search 没有可以接受通过引用传递的列表参数的重载。 re.search 返回匹配数据对象或无。
  • this Python demo。我希望这可以帮助您了解这是如何在 Python 中完成的。您将fp 用作您认为将是一个列表的变量——不,它是一个标志,如PHP 中的/s(dotall)或/i(不区分大小写)修饰符。
  • u 为您的正则表达式字符串添加前缀,类似于step1list(即re.compile(u'...')。虽然您的搜索字符串是unicode,但您的正则表达式是二进制的(希腊字符可能是UTF-8 编码的) )。

标签: php python regex preg-match


【解决方案1】:

来自docs:(另见match vs search

import re
p = re.compile( regex )
m = p.search( 'string goes here' ) #p.match() to find from start of string only
if m:
    print 'Match found: ', m.group() # group(1...n) for capture groups
else:
    print 'No match'

【讨论】:

  • 在过去的一个小时里,我一直在努力让它与它一起工作,但我做不到。我明白它的作用,但也许我使用的正则表达式本身有问题?让我给你更多信息,也许你可以帮助我
  • 我已经更新了原始帖子以反映更改,如果您和 @Wiktor-Stribiżew 先生可以再看一下,我将不胜感激。
  • 您能否提供一个说明问题的 regex101.com 链接?
  • 不幸的是,我对正则表达式知之甚少——但我使用的 php 肯定是正确的(至少对于 php 而言??)因为这个过程适用于 php。我刚刚意识到,在 python 上,“if m”返回 false,因为它不会进入 if 在 php 中使用完全相同的单词“σογια”,当它执行时,s 变为“σογια”,stem 变为“”,后缀变成“σογια”
  • regex101.com 将允许您选择 pcre(php) 或 python 样式的正则表达式。
猜你喜欢
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2019-11-24
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多