我的问题就是这个问题的延续。 基本上,我有一个这样的单词表:
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
从那里开始,如果不需要,您可以简单地丢弃最后一个序列,并继续处理第一个序列