识别正则表达式匹配的前缀

时间:2015-08-04 08:53:10

标签: python regex

我有一个需要从TCP套接字接收一些数据的模块,我有一个正则表达式,可以用来验证我收到的数据。

现在我面临着知道何时收到所有数据的问题,我正在等待。如果我已经收到的数据与正则表达式不匹配,则可能意味着对等方发送了我必须拒绝的无效数据或者我还没有收到所有数据,我必须阻止在套接字上读取更多。

更改协议不是一种选择,因为发件人不受我控制。

有没有办法找出字符串是否是匹配特定正则表达式的字符串的有效前缀?

例如,给定正则表达式baseClass* object = new derivedClass; object->foo(); // This will call derivedClass::foo(); 我想识别字符串DataTable tbl = new DataTable(); foreach (DataRow row in tbl.Rows) { object cellData = row["colName"]; } (ab)*cd,因为它们都是aba的前缀并拒绝ababc,因为它永远不能扩展为正则表达式的匹配。

我知道原则上这是可能的,因为任何正则表达式都可以变成有限自动机,修改有限自动机以识别匹配前缀是微不足道的。但我发现在Python中使用正则表达式无法实现这一点。

可以这样做吗?

1 个答案:

答案 0 :(得分:2)

正确的搜索关键字是正则表达式partial matches。您可以在此处找到它:https://pypi.python.org/pypi/regex

来自doc:

>>> pattern = regex.compile(r'\d{4}')
>>> # Initially, nothing has been entered:
>>> print(pattern.fullmatch('', partial=True))
<regex.Match object; span=(0, 0), match='', partial=True>
>>> # An empty string is OK, but it's only a partial match.
>>> # The user enters a letter:
>>> print(pattern.fullmatch('a', partial=True))
None
>>> # It'll never match.
>>> # The user deletes that and enters a digit:
>>> print(pattern.fullmatch('1', partial=True))
<regex.Match object; span=(0, 1), match='1', partial=True>
>>> # It matches this far, but it's only a partial match.
>>> # The user enters 2 more digits:
>>> print(pattern.fullmatch('123', partial=True))
<regex.Match object; span=(0, 3), match='123', partial=True>
>>> # It matches this far, but it's only a partial match.