首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python欧芹-域名语法

python欧芹-域名语法
EN

Stack Overflow用户
提问于 2014-02-28 22:52:22
回答 1查看 332关注 0票数 0

我试图获得一个有限的语法,以使域名工作。语法在https://www.rfc-editor.org/rfc/rfc1035第2.3.1节中定义。它的子集如下所示

代码语言:javascript
复制
<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
<let-dig-hyp> ::= <let-dig> | "-"
<let-dig> ::= <letter> | <digit>
<letter> ::= any one of the 52 alphabetic characters A through Z in upper case and a through z in lower case
<digit> ::= any one of the ten digits 0 through 9

下面是我的尝试。我在试着和label匹配

代码语言:javascript
复制
from parsley import makeGrammar
import ometa
domain = makeGrammar('''
letdighyp = (letterOrDigit|-)
label = letterOrDigit letdighyp+ letterOrDigit
''', {})

tests = ('abcd1000',)
for t in tests:
    try:
        print domain(t).label()
    except ometa.runtime.ParseError as e:
        print 'parse failed for', t
        print e

跑步给了我

代码语言:javascript
复制
parse failed for abcd1000

abcd1000
^
Parse error at line 2, column 0: expected EOF. trail: [digit letdig letdighyp]

我做错什么了?

附注:

代码语言:javascript
复制
    label = letterOrDigit letdighyp+ letterOrDigit

是我找不到工作的那条线。如果最后一个letterOrDigit不存在,则匹配字符串。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-05 12:31:56

尝试:

代码语言:javascript
复制
from parsley import makeGrammar
import ometa
def check_the_rest(s):
    if '-' in s:
        return s[-1].isalnum()
    return True

domain = makeGrammar('''
letdighyp = (letterOrDigit|'-')
# label = <letterOrDigit (letdighyp* letterOrDigit)*>
label = <letter the_rest>
the_rest = letdighyp*:r ?(check_the_rest(r)) -> r
''', dict(check_the_rest=check_the_rest))

tests = ('a', 'abcd1000', 'a-',)
for t in tests:
    try:
        print('✓', domain(t).label())
    except ometa.runtime.ParseError as e:
        print('parse failed for', t)
        print(e)

(最后一次测试应该失败)

我正在使用py3分支,由vsajip提供。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22107347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档