单词分界符

-- Start

假设你想在一个文件中搜索 hi,很不幸 hisoft (海辉软件)也被查出来了,可是我只想搜索单词hi,怎么办呢?试一试下面的表达式吧:

\<hi\>

\< 匹配单词的开始,\> 匹配单词的结束,其实还有一个元字符也表示单词分界符,下面的表达式和上面是一个意思:

\bhi\b

既然有匹配单词边界的需求,当然也会有匹配非单词边界的需求,如果你想查找包含 hi 的单词,试一试下面的表达式吧:

hi\B

怎么样,简单吧,注意以上元字符匹配的是一个边界,而不是具体的字符。恭喜你,你又学会了四个元字符。

元字符名称匹配对象
.点号(dot)单个任意字符
[...]字符组(Character Class)列出的任意字符
[^...]排除型字符组(Negated Character Class)未列出的任意字符
^脱字符(caret)行的起始位置
$美元符(dollar)行的结束位置
\< 单词的起始位置
\> 单词结束位置
\bBoundary单词边界
\B 非单词边界
|竖线(bar)匹配分割两边的任意一个表达式

---更多参见:正则表达式精萃
-- 声 明:转载请注明出处
-- Last Updated on 2012-04-21
-- Written by ShangBo on 2012-04-21
-- End


下面是用Python实现的Pascal语言子集单词号的词法分析程序: ```python import re # 定义正则表达式模式 identifier_pattern = r'([a-zA-Z]+[\w]*)' unsigned_integer_pattern = r'(\d+[\d]*)' single_character_delimiter_pattern = r'([\(\)\[\]:;\.,])' # 读取Pascal源代码文件 with open('pascal_code.txt') as f: code = f.read() # 词法分析 tokens = [] while code: # 匹配标识 match = re.match(identifier_pattern, code) if match: tokens.append(('identifier', match.group())) code = code[len(match.group()):] continue # 匹配无号整数 match = re.match(unsigned_integer_pattern, code) if match: tokens.append(('unsigned_integer', match.group())) code = code[len(match.group()):] continue # 匹配单字分界 match = re.match(single_character_delimiter_pattern, code) if match: tokens.append(('single_character_delimiter', match.group())) code = code[len(match.group()):] continue # 无法匹配任何模式,抛出异常 raise ValueError('无法识别的字: ' + code[0]) # 输出所有识别出的单词号 for token in tokens: print(token) ``` 上述程序中,首先定义了三个正则表达式模式,分别用于匹配标识、无号整数和单字分界。然后读取Pascal源代码文件,并对每个字进行词法分析。在每次循环中,程序首先尝试用标识模式匹配当前代码片段,如果匹配成功,则将匹配的标识加入tokens列表中,并将代码指针向后移动匹配的长度。如果无法匹配标识,则尝试用无号整数模式匹配当前代码片段。如果匹配成功,则将匹配的无号整数加入tokens列表中,并将代码指针向后移动匹配的长度。如果无法匹配无号整数,则尝试用单字分界模式匹配当前代码片段。如果匹配成功,则将匹配的单字分界加入tokens列表中,并将代码指针向后移动匹配的长度。如果无法匹配任何模式,则抛出异常。 最后,程序输出所有识别出的单词号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值