基于正则表达式的词行词法分析|自然语言处理


1.任务一:邮箱地址和网址提取

1.1任务描述

∙ \bullet 实现基于正则表达式的字符串抽取,完成对 string文本的邮箱地址和网址,并按下面格式输出。

测 试 输 入 {\color{Violet}测试输入}

(1)我的邮箱:nlp@nudt.com
(2)please click https://www.educoder.net

测 试 输 出 {\color{Violet}测试输出}

(1)提取邮箱地址如下:
nlp@nudt.com
(2)提取网址如下:
https://www.educoder.net

1.2代码

import re
string =input()

#分别生成对应正则表达式对象
regex1 = re.compile(r'\w+@\w+.\w+')
regex2 = re.compile(r'ht{2}ps://w{3}.\w+.\w+')

res = regex1.findall(string)
if len(res):
    print('提取邮箱地址如下:')
for i in res:
    print(i)

res1 = regex2.findall(string)
if len(res1):
    print('提取网址如下:')
for i in res1:
    print(i)

2.任务二:密码提取

2.1任务描述

∙ \bullet 实现基于正则表达式的字符串抽取,完成对 string文本的密码提取,并按下面格式输出。

测 试 输 入 {\color{Violet}测试输入}

密码是:NUDT_NLP2021

测 试 输 出 {\color{Violet}测试输出}

提取密码是
NUDT_NLP2021

2.2代码

import re
string =input()

#提取密码代码,密码中包含字母、数字、下划线
print("提取密码是")
p = re.compile('[a-z]|[A-Z]|_|\d')
t = re.findall(p,string)
if t:
    for i in t:
        print(i,end="")
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
词法分析是编译原理的一个重要内容,它的主要任务是将输入的源程序分割成一个一个的单词,同时识别出每个单词的类别,生成记号流作为后续语法分析的输入。在使用高级语言进行词法分析时,我们通常会使用正则表达式和有限自动机来实现。 下面是一个基于 Java 的简单词法分析器的示例代码: ```java import java.util.regex.*; public class LexicalAnalyzer { private String input; // 输入的源程序 private int pos = 0; // 当前读取到的位置 // 定义正则表达式 private static final Pattern ID_PATTERN = Pattern.compile("[a-zA-Z][a-zA-Z0-9]*"); private static final Pattern NUM_PATTERN = Pattern.compile("[0-9]+"); private static final Pattern OP_PATTERN = Pattern.compile("[+\\-*/]"); // 构造函数 public LexicalAnalyzer(String input) { this.input = input; } // 获取下一个记号 public Token getNextToken() { while (pos < input.length()) { char c = input.charAt(pos); if (Character.isWhitespace(c)) { pos++; continue; // 跳过空白字符 } Matcher idMatcher = ID_PATTERN.matcher(input.substring(pos)); if (idMatcher.lookingAt()) { String lexeme = idMatcher.group(); pos += lexeme.length(); return new Token(TokenType.ID, lexeme); } Matcher numMatcher = NUM_PATTERN.matcher(input.substring(pos)); if (numMatcher.lookingAt()) { String lexeme = numMatcher.group(); pos += lexeme.length(); return new Token(TokenType.NUM, lexeme); } Matcher opMatcher = OP_PATTERN.matcher(input.substring(pos)); if (opMatcher.lookingAt()) { String lexeme = opMatcher.group(); pos += lexeme.length(); return new Token(TokenType.OP, lexeme); } throw new RuntimeException("Invalid token at position " + pos); } return new Token(TokenType.EOF, ""); // 返回结束标记 } // 测试代码 public static void main(String[] args) { String input = "x = 1 + 2 * y"; LexicalAnalyzer lexer = new LexicalAnalyzer(input); Token token; do { token = lexer.getNextToken(); System.out.println(token); } while (token.getType() != TokenType.EOF); } } // 记号类型枚举 enum TokenType { ID, // 标识符 NUM, // 数字 OP, // 运算符 EOF // 结束标记 } // 记号类 class Token { private TokenType type; // 记号类型 private String lexeme; // 记号对应的字符串 public Token(TokenType type, String lexeme) { this.type = type; this.lexeme = lexeme; } public TokenType getType() { return type; } public String getLexeme() { return lexeme; } @Override public String toString() { return String.format("(%s, %s)", type, lexeme); } } ``` 在这个示例中,我们定义了三个正则表达式分别用于匹配标识符、数字和运算符。在 `getNextToken()` 方法中,我们使用 `Matcher` 类来进行匹配,如果匹配成功则返回相应的记号。如果无法匹配任何记号,则抛出异常。 `main()` 方法中我们将输入的源程序作为参数传入词法分析器,并依次输出每个记号的类型和字符串。 当我们使用 `LexicalAnalyzer` 类进行词法分析时,可以按照以下步骤进行: 1. 创建 `LexicalAnalyzer` 类的实例,将源程序作为参数传入; 2. 重复调用 `getNextToken()` 方法直到返回的记号类型为 `EOF`; 3. 对于每个记号,根据其类型进行相应的处理。 这样就完成了一个简单的基于 Java 的词法分析器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比奇堡咻飞兜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值