我有一个模块需要从 TCP 套接字接收一些数据,并且我有一个正则表达式可用于验证我收到的数据。
现在我面临着知道何时收到我正在等待的所有数据的问题。如果我已经收到的数据与正则表达式不匹配,则可能意味着对等方向我发送了无效数据,我必须拒绝该数据,或者我尚未收到所有数据,并且我必须阻塞套接字才能读取更多。
无法更改协议(protocol),因为发件人不在我的控制范围内。
有什么方法可以判断一个字符串是否是与特定正则表达式匹配的字符串的有效前缀?
例如,给定正则表达式 (ab)*cd
我想识别字符串 aba
和 ababc
因为它们都是前缀ababcd
并拒绝 abac
,因为它永远无法扩展为正则表达式的匹配。
我知道这原则上是可能的,因为任何正则表达式都可以变成有限自动机,并且修改有限自动机以识别匹配的前缀是微不足道的。但我发现没有办法在 Python 中使用正则表达式来实现这一点。
这可以做到吗?
最佳答案
正确的搜索关键字是正则表达式 partial matches 。您可以在这里找到它:https://pypi.python.org/pypi/regex
来自文档:
>>> 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.
关于python - 识别正则表达式匹配的前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31804781/