在以下示例中:
“名词1左右两侧左右摇摆zuǒ-yòuyáobǎivoolillating;不稳定;犹豫主席台左右,红旗迎风飘扬.Shǔxítáizuǒyòu,hóngqíyíngfēngpiāoyáng。红旗飘扬在讲台的两侧.2一个数字]左右八点左右左右一个月左右yīgeyuèzuǒyòu一个月左右身高一米七左右Shēngāoyīmǐqīzuǒyòu身高约1.70米价值十元左右.Giàzhíshíyuánzuǒyòu。值得10元左右.3个人近距离;随后屏幕左右Píngtuǒzuǒyòu命令一个人的服务员清除动词大师;控制;影响左右局势zuǒyòujúshì掌握情况;在控制为人所左右wéinénusǒzuǒyòu由另一个人控制;在另一个人的影响下,他这个人不是别人能左右得了的。他不是一个受到其他人影响的人无论如何;无论如何;无论如何;无论如何;任何情况下左右闲没事,我就陪你走一趟吧.Zuǒyòuxiánzheméishì,wǒjiùpéinǐzǒuyītàngba.Ānyway我现在有空了所以让我和你一起去吧。 “
我想根据名词,形容词,副词等分开字符串......如果它们有多个,也可以根据数字分开。
所以最终的结果应该是:
noun
["left and right sides", "左右摇摆 zuǒ-yòu yáobǎi vacillating; unsteady; hesitant 主席台左右, 红旗迎风飘扬。 Zhǔxítái zuǒyòu, hóngqí yíngfēng piāoyáng. Red flags are fluttering on both sides of the rostrum."]
["[after a numeral] about; or so", "八点钟左右 bā diǎn zhōng zuǒyòu around eight o'clock 一个月左右 yī ge yuè zuǒyòu a month or so 身高一米七左右 Shēngāo yī mǐ qī zuǒyòu be about 1.70 metres in height 价值十元左右。 Jiàzhí shí yuán zuǒyòu. It's worth about 10 yuan."]
["those in close attendance; retinue", "屏退左右 Píng tuì zuǒyòu order one's attendants to clear out"]
verb
["master; control; influence", "左右局势 zuǒyòu júshì be master of the situation; in control 为人所左右 wéi rén suǒ zuǒyòu controlled by another; fall under another’s influence 他这个人不是别人能左右得了的。 Tā zhège rén bù shì biéren néng zuǒyòu déle de. He is not a man to be influenced by others."]
adverb
["dialect anyway; anyhow; in any case", "左右闲没事, 我就陪你走一趟吧。 Zuǒyòu xiánzhe méishì, wǒ jiù péi nǐ zǒu yī tàng ba. Ānyway I’m free now so let me go with you"]
noun
,verb
和adverb
应该是键,而值可能是dict。由于noun
在这里有三个对象,因此应该有三个不同的结果。
因此,第一步是从noun
,adjective
adverb
,verb
等处获取组件,并将其存储到某些变量中。但在这种情况下,我无法根据特定字符串获得相关结果。例如:
re.findall("(noun|verb|adverb|adjective)", s)
这会返回['noun', 'verb', 'adverb']
,因为它只关注完全匹配。
所以我添加.+
使其成为re.findall("(noun|verb|adverb|adjective).+", s)
并在noun
后获得任何单词,但随后它抓住了noun
之后的所有字符串,包括verb
之后的所有字符串1}}或adverb
(并返回['noun']
)。
所以我撞墙了。是否可以获得相关部分,但除了关键字匹配之外还能得到完整的结果?
答案 0 :(得分:2)
这不是正则表达式的工作。你想要匹配的东西太多了。
为字典条目编写正确的语法,就像它是一种编程语言一样,然后根据该语法解析数据。
像这样:
noun
,verb
,adverb
。作为一名有时候的词典编纂者,我还建议您将dialect
等标签(通常从标准词汇表中提取)视为可选关键字,而不是定义的一部分。
答案 1 :(得分:1)
最简单的事情可能是import java.lang.reflect.*;
class Test {
int turn = 1;
boolean checkValueVariable(String variableName, int value) throws Exception {
Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.getName().equals(variableName))
return field.getInt(this) == value;
}
return false;
}
public static void main(String... args) {
Test test = new Test();
String variableName = "turn";
int variableValue = 1;
try {
System.out.println(test.checkValueVariable(variableName, variableValue));
} catch (Exception e) {
e.printStackTrace();
}
}
}
首先在词性模式上使用re.split
字符串:re.split('(noun|adjective|verb|adverb)', s)
。对于提供的输入,这包括开头的空项目,然后其余部分将在词性标签和两者之间的位之间交替,然后您可以进一步处理。
答案 2 :(得分:1)
您可以使用
(?s)(noun|verb|adverb|adjective)(.*?)(?=(?:noun|verb|adverb|adjective|$))
请参阅regex demo
<强>详情
(?s)
- 内联re.DOTALL
等效(noun|verb|adverb|adjective)
- 第1组:单词noun
,verb
,adverb
或adjective
(.*?)
- 第2组:任意0个字符尽可能少,直至(但不包括)第一次出现:(?=(?:noun|verb|adverb|adjective|$))
- noun
,verb
,adverb
,adjective
或字符串结尾(因为它是一个积极的前瞻,(?=...)
,匹配的文本不会成为比赛的一部分。)在Python中,与re.findall
一起使用:
re.findall(r'(?s)(noun|verb|adverb|adjective)(.*?)(?=(?:noun|verb|adverb|adjective|$))', s)