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



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

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 (,分隔符也可以改变(即 ._(。

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

这是一个有趣的问题。

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}

你看,有多个正确答案。

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

我的结论:

问题在于,为机器学习准备数据比创建正则表达式要多得多。如果你想确保你涵盖了所有内容,你需要有完整的数据,所以正则表达式可能就不费吹灰之力了。

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

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

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

HAT18178
890909
098070313
1

从那里开始,如果不需要,您可以简单地丢弃最后一个序列,并继续处理第一个序列

最新更新