版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章文本处理4.1正则表达式4.6字符串替换4.2字符统计和翻译4.7字符串提取4.3字符串连接4.8字符串定制输出4.4字符串拆分4.9练习案例4.5字符串查询4.10小结第4章文本处理文本处理是指对文本数据进行各种操作和转换,从中提取信息、清洗数据和分析数据等。正则表达式(regularexpression,常简写为regex、regexp或RE)是处理文本数据,尤其是非结构化文本数据的强大工具。R语言提供了丰富的字符串处理函数和程序包,可以满足各种文本处理需求。本章将首先介绍R语言中正则表达式的基础知识,然后介绍常用的字符串处理函数,包括R语言base程序包和stringr程序包函数。4.1正则表达式4.1正则表达式正则表达式是由一系列字符和特殊符号组成,用于描述文本模式(pattern)的字符串。它广泛应用于文本处理,如查找替换、拼写检查、信息提取和文本挖掘等。许多编程语言都支持正则表达式,各编程语言遵循不同的正则表达式规范,主要包括POSIX规范、Perl兼容正则表达式(perlcompatibleregularexpressions,PCRE)和ICU(internationalcomponentsforunicode)正则表达式等。base程序包内置了一些字符串处理函数。stringr程序包是常用的字符串处理包,其函数定义简洁直观,命名风格一致,都以str_开头,便于记忆。对于复杂的字符串处理任务,stringr程序包能提供更丰富的功能和更好的性能。stringr程序包默认使用ICU正则表达式引擎,支持Unicode字符集,更适合处理多语言文本以及包含特殊符号和表情符号的复杂文本。4.1正则表达式4.1.1显示匹配stringr程序包的str_view()可以更直观地理解正则表达式在字符串中的匹配过程和结果,从而调试和优化正则表达式模式。str_view():打印显示字符串的底层表示,以及查看字符串如何匹配正则表达式模式(演示)。4.1.2元字符在正则表达式中,大部分普通字符会按字面匹配。但还有一些具有特殊意义的专用字符,称为元字符(metacharacter)。通过结合普通字符,以及后续介绍的字符类、量词、定位符、分组等,可以创建复杂的正则表达式模式,以满足特定的文本处理需求(演示)。4.1正则表达式4.1.3转义字符正则表达式中反斜杠“\”通常用作转义字符(escapecharacter)。以转义字符开头的字符序列具有不同于该字符序列单独出现时的语义,因此,这类字符序列被称为转义序列,至少包含2个字符。转义序列的常见用法包括:转义元字符:使用“\”转义元字符,使其失去特殊意义,从而匹配字符本身。标记特殊字符:“\”后跟特定字符表示非打印字符、缩略字符类、定位符等。回溯引用(backreference):“\”后跟一个正整数(如\1、\2等)可以引用之前的捕获分组。编码Unicode字符:使用\u后跟4个十六进制数字表示Unicode字符。R语言使用反斜杠“\”作为转义字符,因此需要使用两个反斜杠“\\”表示单个反斜杠“\”;可以使用R语言的原始字符串(rawstring)(演示)。4.1正则表达式4.1.4字符类正则表达式中的字符类(characterclass)也被称为字符集(characterset),用于匹配一组字符中的任意一个。字符类允许在一个模式中指定多个备选字符,从而提供了更灵活的匹配方式。字符类通过方括号“[]”定义,在其中列出备选字符(演示)。在字符类内部,可以在两个字符中间使用连字符“-”表示连续的字符范围(演示)。若连字符“-”出现在字符类的开头或结尾,则仅为普通字符,用于匹配该字符本身(演示)。在字符类内部,可以在开头使用脱字符“^”表示否定字符集(演示)。若脱字符“^”出现在字符中间,则仅为普通字符,用于匹配该字符本身(演示)。字符类可用于匹配基本元字符本身(演示)。若要匹配字符类中有特殊意义的字符,需要使用反斜杠“\”对这些字符进行转义(演示)。4.1正则表达式4.1.4字符类正则表达式支持在字符类内部使用POSIX字符组。POSIX字符组是在遵循POSIX规范下预定义的更高级别的字符分类,格式为[:字符类别:]。POSIX字符组中的“[]”是固有界定符,使用时应将整个POSIX字符组放入字符类的方括号“[]”(演示)。POSIX字符组匹配的字母字符和标点符号不限于英文字母,也适用于中文汉字和标点符号。正则表达式提供了一些缩略字符类,它们是表示常见字符类别的快捷方式,更加简洁易写。缩略字符类通过反斜杠“\”加上一个特殊字符表示。若不使用原始字符串表示正则表达式,则需要将“\”写成“\\”(演示)。4.1正则表达式4.1.5量词量词(quantifier)又称重复修饰符,用于指定前面的元素(字符、字符类、分组等)的匹配次数。量词可以灵活指定模式的重复次数,从而实现更精确的匹配。如病例数从个位数到成千上万都有可能,因此需要匹配数字字符一次或多次(演示)。如国内手机号码固定为11位,因此可以匹配数字字符11次(演示)。匹配次数不确定的量词,如?、*、+、{n,}和{n,m},默认采用贪婪模式,即尽可能多地匹配重复次数。当“?”紧跟在量词后面时,则是非贪婪模式,即尽可能少地匹配重复次数(演示)。4.1正则表达式4.1.6定位符在默认情况下,正则表达式匹配字符串的任意位置。定位符用于指定匹配发生的位置(如字符串的开头、结尾、单词边界等),而不会匹配具体字符(演示)。4.1.7分组分组(grouping)使用“()”将一系列元素(字符、字符类、量词等)组合成一个整体的子模式,在正则表达式中分组的优先级较高(演示)。分组允许对其中的子模式应用量词或修饰符(演示)。正则表达式中的每个分组都会按照出现顺序自动编号,规则是从1开始,从左至右编号依次加1。分组默认为捕获分组,会捕获匹配的子模式内容,并可通过回溯引用访问捕获的子串。回溯引用的语法为\n(其中n为捕获分组的编号)(演示)。4.1正则表达式4.1.8处理选项处理选项又称标志或修饰符,用于修改正则表达式引擎的行为,如大小写不敏感匹配、多行模式等。常见的处理选项及其含义(演示):(?i):大小写不敏感匹配。在默认情况下,正则表达式匹配时区分大小写,设置此选项后匹配时可忽略字母大小写。(?m):多行模式。在默认情况下,定位符“^”“$”分别用于匹配整个字符串的开头和结尾,设置此选项后可以匹配每一行的开头和结尾。(?s):单行模式。此时,使用点号“.”可以匹配包括换行符\n在内的所有字符。(?x):扩展模式。允许在模式中使用空格和注释,提高可读性。空格除了在字符类中或被转义时会被保留,其他情况下都会被忽略。4.2字符统计和翻译4.2字符统计和翻译4.2.1字符统计函数base程序包的nchar(x,type="chars")用于统计字符型向量x中每个字符串的字符个数(演示)。使用参数type=“bytes”表示计算字符型向量x中每个字符串所占的字节长度。一个英文字符(字母、数字、标点)占用1字节,而中文汉字在不同字符集编码下所占的字节长度有所差异(演示)。stringr程序包的str_length()用于返回字符串中代码点的数量,代码点代表字符数(演示)。4.2.2字符翻译函数字符翻译常用base程序包的chartr()
(演示)。base程序包提供的toupper()用于将字符型向量中的小写字母转换为大写字母,tolower()则用于将字符型向量中的大写字母转为小写字母(演示)。4.3字符串连接4.3字符串连接4.3.1base程序包函数base程序包的paste()
可将多个字符型向量按照元素对应连接,使用参数sep指定分隔符,默认为空格。输入其他类型的对象会自动将其转换为字符型向量(演示)。当输入的向量长度不同时,较短的向量会循环补齐(演示)。使用参数collapse可将连接后的字符型向量的各元素进一步合并为一个字符串(演示)。paste0()等价于paste()指定分隔符为空字符串,但比paste()更高效(演示)。4.3.2stringr程序包函数str_c()的用法与paste()的用法类似,但其参数sep的默认值为空字符串,因此等价于paste0()(演示)。str_flatten()则类似于str_c(),通过使用参数collapse将字符型向量的各元素按照指定分隔符连接为一个字符串。使用last参数可单独指定连接最后两个元素的分隔符(演示)。4.4字符串拆分4.4字符串拆分4.4.1base程序包函数字符串拆分是与字符串连接相反的操作,常用base程序包的strsplit()(演示)。strsplit()返回一个与输入字符型向量等长的列表,第i个元素为字符串x[i]的拆分结果。当只输入一个字符串时,通常会取出结果列表中的第一个元素(演示)。当拆分符split与输入字符型向量完全匹配时,strsplit()返回空字符串(演示)。当拆分符split为空字符串时,strsplit()会将字符串拆分为单个字符(演示)。当拆分符split为正则表达式时,若希望按固定字符串拆分,则应设置fixed=TRUE(演示)。4.4字符串拆分4.4.2stringr程序包函数str_split():语法与base程序包中strsplit()的类似(演示)。当只对单个字符串进行拆分时,可以使用str_split_1(),结果将返回一个向量(演示)。当pattern是正则表达式时,为按照固定字符串匹配拆分,str_split()中应使用fixed()进行修饰(演示)。str_split()提供了参数n,用于限定拆分的项数,默认为Inf,表示拆分所有可能的匹配。若n小于最大拆分项数,则最后一项子串不拆分(演示)。str_split()中的布尔型参数simplify,用于控制是否将拆分结果简化为字符型矩阵(演示)。str_split_fixed():每个字符串拆分后的子串个数相同,可返回字符串矩阵(演示)。函数名中的fixed指拆分后的结果为固定的字符串个数。若输入的字符串拆分项数少于指定的项数n,则用空字符串“""”补齐(演示)。4.5字符串查询4.5字符串查询4.5.1base程序包函数字符串查询是指在输入字符串中搜索特定模式的子串,主要使用正则表达式的匹配来完成。base程序包提供了多个字符串查询函数,包括grep()、grepl()、regexpr()、gregexpr()、regexec()和gregexec()等。grep():在输入的字符型向量中查找匹配特定模式的字符串元素(演示)。fixed=TRUE表示按模式固定的字面内容匹配,而ignore.case=TRUE则表示在匹配时忽略字母大小写。当二者存在冲突时,参数fixed的设置优先(演示)。移除fixed=TRUE后,则按照正则表达式匹配(演示)。与grep()用法类似,grepl()返回与输入字符型向量等长的逻辑型向量,用于表示每个字符串元素是否匹配模式。因此,该函数没有value和invert参数(演示)。4.5字符串查询4.5.1base程序包函数regexpr()的语法与grepl()的相同,返回与输入字符型向量等长的整型向量,表示字符型向量中每个元素的第一个匹配模式的起始位置,其中-1表示未匹配。返回的整型向量还具有3个属性(attr):匹配字符串的长度(match.length)、匹配索引的类型(index.type),以及是否使用字节匹配(useBytes)(演示)。gregexpr()的作用与regexpr()的类似,但其返回结果为列表,且每个列表元素与regexpr()返回结果的形式相同,表示对应的字符型向量所有匹配模式的起始位置。由于regexpr()和gregexpr()返回匹配字符串的起始位置与长度,因此可用于字符串提取。startsWith(x,prefix):判断字符型向量的每个元素是否以前缀字符串prefix开头,返回与字符型向量等长的逻辑型向量(演示)。endsWith(x,suffix):判断字符型向量的每个元素是否以后缀字符串suffix结尾(演示)。4.5字符串查询4.5.2stringr程序包函数str_detect():检测字符型向量string的每个元素是否匹配pattern模式,并返回与string等长的逻辑型向量(演示)。pattern默认为正则表达式。若需要使用固定字符串模式匹配,可以用fixed()修饰(演示)。设置参数negate=TRUE,则返回相反结果(演示)。str_detect()返回的逻辑向量便于查找匹配模式的字符型向量元素,也有封装函数str_subset()和str_which()(演示)。str_subset():查找匹配的元素,是x[str_detect(x,pattern)]的封装函数,等价于grep(pattern,x,value=TRUE)(演示)。str_which():查找匹配元素的索引,是which(str_detect(x,pattern))的封装函数,等价于grep(pattern,x)(演示)。4.5字符串查询4.5.2stringr程序包函数str_locate():定位字符型向量string的每个元素首次匹配pattern模式的字符位置。返回结果为整型矩阵,其中每行都对应一个string元素的匹配结果,两列start和end分别表示匹配的字符起始位置和结束位置,若未匹配,则取值为NA(演示)。str_locate_all():定位所有匹配模式的字符位置。返回结果为列表,每个列表元素都为整型矩阵,形式与str_locate()的返回结果形式相同,行数表示匹配的次数(演示)。str_count():统计字符型向量的每个元素匹配pattern模式的次数(演示)。str_starts()和str_ends():检测字符串是否以给定的模式开头或结尾,其语法与str_detect()的语法相同,支持正则表达式匹配(演示)。4.6字符串替换4.6字符串替换4.6.1base程序包函数字符串替换是字符串查询后的常见操作之一,常用于数据清理。sub()和gsub()提供了字符串替换功能,二者语法相同,形式上只比grepl()多了一个参数replacement,表示替换的字符串。sub()只替换字符型向量x中每个元素首次匹配pattern模式的子串,而gsub()替换所有匹配的子串(演示)。当fixed=FALSE按正则表达式匹配时,参数replacement可以使用\1、\2等回溯引用pattern模式中捕获分组的子串(演示)。在数据清理任务中,为了避免遗漏替换字符串,更常用gsub()。通过把不规则的分隔符替换为空字符串,可将原始数据清洗为结构化数据,方便读取并做进一步处理(演示)。4.6字符串替换4.6.2stringr程序包函数字符串替换函数为str_replace()和str_replace_all()。前者只替换首次匹配模式的子串,而后者替换所有匹配模式的子串(演示)。若需要对每个元素执行多次替换,则可以向参数pattern传递一个命名向量(c(pattern1=replacement1))。利用这一特性,可以实现类似chartr()的字符翻译(演示)。str_replace_all()是逐次迭代替换的,而不是同时应用命名向量中的所有替换规则。对于该情况,一种解决方案是临时标记上一次替换的结果,避免来回替换(演示),一般推荐使用chartr()。str_remove()和str_remove_all():删除匹配模式的子串,实际等同于str_replace()和str_replace_all()指定替换字符串为空字符串“""”(演示)。pattern模式默认按正则表达式匹配,并区分大小写字母。若想匹配时不区分大小写字母,可以regex()中设置ignore_case=TRUE(演示)。4.7字符串提取4.7字符串提取4.7.1base程序包函数字符串提取包括两种形式,一种是根据位置来提取子串,另一种是提取匹配模式的子串。substr()和substring():提取指定位置的子串(演示)。两个函数的参数都是向量化,但返回结果的向量长度有所区别。substr()返回的子串个数与输入字符型向量等长,而substring()返回的子串个数由参数向量的最大长度确定,较短的参数向量会循环补齐(演示)。substr()和substring()都支持赋值操作,可以对提取的子串进行替换(演示)。若substring()提取的子串短于替换字符串,则仅替换前者长度的部分。反之,若提取的子串长于替换字符串,则仅替换后者长度的部分(演示)。substr()和substring()只能对每个元素的单一子串进行替换(演示)。4.7字符串提取4.7.1base程序包函数regexpr():查询匹配模式的子串,返回其起始位置和长度。可进一步使用regmatches()提取匹配的子串,获取开始日期(演示)。使用gregexpr()的匹配结果,可以同时提取开始日期和结束日期(演示)。regmatches()返回值由模式匹配结果m决定。若m是向量,则返回仅包含首次匹配的子串向量;若m是列表,则返回同时包含匹配和未匹配的子串列表。匹配的列表元素为所有匹配的子串向量,而未匹配的列表元素为character(0),即长度为零的字符型向量。regmatches()支持赋值操作,可以替换匹配的子串(演示)。使用gsub()实现,则只需一行代码gsub("/","-",x),更加简洁。4.7字符串提取4.7.2stringr程序包函数str_sub():根据位置提取子串,与base程序包中substr()和substring()的功能相同(演示)。str_sub()返回与参数向量等长的字符型向量,较短的参数向量会循环补齐(演示)。str_sub()中除了向start和end传递成对向量,还可以只向start传递一个列名为start和end或者start和length的两列矩阵。对于未匹配的字符起始位置和结束位置仍会返回NA(演示)。str_sub()支持赋值操作,可以对提取的子串进行替换(演示)。str_sub()的替换操作相当于完全删除提取的子串,并插入完整的替换字符串。stringr程序包另外提供了str_sub_all(),它可以对每个元素提取多个子串,但不支持赋值操作(演示)。4.7字符串提取4.7.2stringr程序包函数str_extract()和str_extract_all():提取匹配模式的子串,且可独立使用。str_extract()用于从字符型向量的每个元素中提取首次匹配模式的子串,若未匹配,则返回NA(演示)。str_extract()提供参数group,通过设置分组编号返回指定捕获分组的子串,而不是匹配的整个子串(演示)。str_extract_all():提取所有匹配模式的子串,默认返回与输入字符型向量string等长的列表。每个列表元素都为字符型向量,包含从对应string元素中提取的所有匹配子串。若没有匹配,则用长度为零的字符型向量character(0)表示(演示)。4.7字符串提取4.7.2stringr程序包函数str_match():提取首次匹配的子串,以及模式中各捕获分组的子串,返回一个字符型矩阵。矩阵每行都对应输入的字符型向量元素的提取结果,第一列为首次匹配的完整子串,其余各列为各捕获分组的子串。若没有匹配,则为NA(演示)。str_match_all():提取所有匹配的子串,以及模式中各捕获分组的子串,返回一个与输入字符型向量等长的列表。每个列表元素都为字符型矩阵,形式与str_match()的返回结果形式相同,行数表示匹配的次数(演示)。4.8字符串定制输出4.8字符串字符串定制输出4.8.1base程序包函数字符串定制输出函数包括strtrim()和strwrap()。strtrim():将输入字符型向量修剪到指定的显示宽度width,返回等长的字符型向量(演示)。strwrap():根据目标列宽对字符串进行换行,得到段落并进行格式化输出(演示)。使用strwrap()限制每行60个字符,首行缩进4个字符,其他行缩进2个字符。换行符被忽略,换行按照指定的行宽进行(演示)。取消各行缩进,给首行添加前缀“>”,其他行添加前缀“+”(演示)。设置simplify为FALSE,返回结果为列表,而非单个字符型向量(演示)。4.8字符串字符串定制输出4.8.2stringr程序包函数str_trunc():将字符串截断至最大宽度,与base程序包中strtrim()的功能类似(演示)。最大宽度参数width按照字符数计算,而非显示宽度,包含了ellipsis的字符数。width必须是整数,不能是向量(演示)。str_trim():删除字符串头尾的空白符。其中side指定删除空白符的位置,取值为both、left和right,分别表示两侧、左侧和右侧,默认值为both(演示)。str_pad()则与str_trunc()功能相反,用于将字符串填充至最小宽度(演示)。str_wrap()与base程序包的strwrap()功能类似,whitespace_only为布尔值,默认为TRUE,表示只在空白符处换行。若将其设为FALSE,则可在任意非单字字符(如/、-等)处换行(演示)。str_wrap():在指定位置插入换行符。需要使用cat()等函数输出,才能看到换行效果(演示)。4.9练习案例4.9练习案例2023年8月9日,中国疾病预防控制中心发布了《2023年7月猴痘疫情监测情况》。本章的练习案例从中提取了各省(区、市)报告的猴痘病例数。请根据本章介绍的stringr程序包,进行以下文本操作:(1)根据链接获取网页文本,通过文本清洗,提取猴痘疫情监测情况文本;(2)从清洗后的猴痘疫情监测情况文本中提取感兴趣的数据,包括疫情监测时间范围、报告疫情的省(区、市)个数、报告总病例数及各地报告病例数;(3)对提取的各数据进行必要的检查校验,以保证准确性。4.10小结4.10小结介绍了R语言正则表达式的语法规则,包括元字符、转义字符、字符类、量词、定位符、分组和处理选项等,以及如何使用stringr程序包的str_view()显示字符串并查看模式匹配情况。按照文本处理中常见的字符串操作,依次介绍字符统计和翻译、字符串连接、字符串拆分、字符串查询、字符串替换、字符串提取和字符串定制输出等的函数。对于每种字符串操作,分别介绍base和stringr程序包的相关函数,并比较它们的异同、优缺点及联系。整体上,R语言内置的字符串函数可以完成许多字符串处理任务,但stringr程序包中的函数设计更加简洁、易于使用。4.10小结函数所属程序包作用主要用法toupper()base小写字母转换为大写字母toupper(x)tolower()base大写字母转换为小写字母tolower(x)paste()base连接字符串paste(…,sep="",collapse=NULL)strsplit()base按照子串拆分字符串strsplit(x,split,fixed=FALSE)grep()base查询字符型向量元素匹配模式的索引grep(pattern,x,ignore.case=FALSE,fixed=FALSE)grepl()base查询字符型向量元素是否匹配模式grepl(pattern,x,ignore.case=FALSE,fixed=FALSE)regexpr()base查询字符型向量元素首次匹配模式的字符位置regexpr(pattern,text,ignore.case=FALSE,fixed=FALSE)gregexpr()base查询字符型向量元素所有匹配模式的字符位置gregexpr(pattern,text,ignore.case=FALSE,fixed=FALSE)startsWith()base查询字符型向量元素是否以前缀字符串开头startsWith(x,prefix)endsWith()base查询字符型向量元素是否以后缀字符串结尾endsWith(x,suffix)sub()base替换字符型向量元素首次匹配模式的子串sub(pattern,replacement,x,ignore.case=FALSE,fixed=FALSE)gsub()base替换字符型向量元素所有匹配模式的子串gsub(pattern,replacement,x,ignore.case=FALSE,fixed=FALSE)本章重要函数4.10小结函数所属程序包作用主要用法substr()base提取或替换指定起始至结束位置的子串substr(x,start,stop)substring()base提取或替换指定起始位置至末尾的子串substring(text,first,last=1000000L)regmatches()base提取或替换字符型向量元素匹配模式的子串regmatches(x,m,invert=FALSE)strtrim()base修剪字符串至指定显示宽度strtrim(x,width)strwrap()base字符串换行为段落格式化输出strwrap(x,width,indent=0,exdent=0,prefix="",simplify=TRUE,initial=prefix)str_view()stringr显示字符串或查看模式匹配情况str_view(string,pattern=NULL)str_length()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学信息科技人教版(新教材)三年级全一册第4单元 创作数字作品 每课教学设计
- 《混凝土用矿物掺合料应用技术规范》
- 衣物收纳真空压缩与褶皱权衡
- 2026江苏无锡科技职业学院招聘高层次人才37人(长期)考试模拟试题及答案解析
- 2026四川成都光华开源资本管理有限责任公司招聘4人笔试模拟试题及答案解析
- 2026湖南株洲市天元区招聘中小学教职工120人考试备考试题及答案解析
- 攀枝花市2026年春季医疗卫生事业单位引才盐边县岗位考核考试备考试题及答案解析
- 2026年宁德市四四二医院招聘医师1人考试备考试题及答案解析
- 2026年及未来5年市场数据中国低温卷绕试验仪行业发展全景监测及投资方向研究报告
- 集体主义主题教育方案
- 生物质颗粒采购合同范本
- 青海教师退休管理办法
- 码头防风防汛管理制度
- 2025年安徽省高考化学试卷真题(含答案详解)
- 小米公司企业管理制度
- 安宁市教育体育系统安宁市外选调中小学教师真题2024
- 建筑工程安全管理桩基工程安全技术课件
- GB/T 10816-2024紫砂陶器
- 防排烟工程知到智慧树章节测试课后答案2024年秋西安科技大学
- 机场接送服务:汽车租赁合同
- 肺腺癌化疗药物及方案
评论
0/150
提交评论