如何以编程方式学习正则表达式?

时间:2014-12-08 17:07:35

标签: regex machine-learning pattern-recognition

我的问题是this one的延续。基本上,我有一个像这样的单词表:

HAT18178_890909.098070313.1
HAT18178_890909.098070313.2
HAT18178_890909.143412462.1
HAT18178_890909.143412462.2

就我的目的而言,我不需要终端.1.2来获取这组名称。我可以手动编写以下正则表达式(使用Python语法):

r = re.compile('(.*\.\d+)\.\d+')

但是,我不能保证我的下一组名称将具有类似的结构,其中最后2个字符将是可丢弃的 - 它可以是3个字符(即.12)并且分隔符也可以改变(即._)。

明确学习正则表达式或确定哪些字符不必要的适当方法是什么?

2 个答案:

答案 0 :(得分:1)

这是一个有趣的问题。

X                                  y
HAT18178_890909.098070313.1        HAT18178_890909.098070313
HAT18178_890909.098070313.2        HAT18178_890909.098070313
HAT18178_890909.143412462.1        HAT18178_890909.143412462 
HAT18178_890909.143412462.2        HAT18178_890909.143412462

问题是没有一个解决方案,但很多

即使是人类,也不清楚你想要什么样的正则表达式。

根据这些数据,我认为学习的可能性是:

只需匹配固定宽度25:.{25}

修正了第一部分:HAT18178_890909.

然后:

每个单独的位置只有2个不同的数字(因为你显示2个案例)。 所以例如[01](0或1),[94]下一个点等等将是一个很好的解决方案。

显而易见的是\d+

但它也可能是\d{9}

你知道,有多个正确答案。

如果第二个点是下划线,那么这些正则表达式仍然有用。

我的结论:

问题在于,为机器学习准备数据要比创建正则表达式要多得多。如果你想确保覆盖所有内容,你需要有完整的数据,那么正则表达式可能会减少工作量。

答案 1 :(得分:-1)

您可以拆分非字母数字字符;

[^a-zA-Z0-9']+

在这种情况下,在这种情况下,你会得到这样的字符串:

HAT18178
890909
098070313
1

从那里你可以简单地丢弃最后一个,如果这是必要的,并继续处理第一个序列