Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在一行中出现字符串后获取任何数字的正则表达式_Regex - Fatal编程技术网

Regex 在一行中出现字符串后获取任何数字的正则表达式

Regex 在一行中出现字符串后获取任何数字的正则表达式,regex,Regex,嗨,伙计们,我正在尝试从这个字符串中获取子字符串以及相应的数字 text=“人类食用的牛奶只能从最后一次治疗后的80小时内从牛身上提取。” 我想从这个句子中选择单词milk和相应的数字80。这是一个较大文件的一部分,我需要一个通用的解决方案,在一行中获取单词milk,然后是该行中该单词后面的第一个数字 (Milk+)\d 这就是我想到的,我可以制作一组牛奶,然后检查数字,但我不知道如何在网上任何地方开始搜索数字,而不仅仅是在牛奶一词之后。还有没有办法使搜索不区分大小写 编辑:如果可能的话,我希

嗨,伙计们,我正在尝试从这个字符串中获取子字符串以及相应的数字

text=“人类食用的牛奶只能从最后一次治疗后的80小时内从牛身上提取。”

我想从这个句子中选择单词milk和相应的数字80。这是一个较大文件的一部分,我需要一个通用的解决方案,在一行中获取单词milk,然后是该行中该单词后面的第一个数字

(Milk+)\d
这就是我想到的,我可以制作一组牛奶,然后检查数字,但我不知道如何在网上任何地方开始搜索数字,而不仅仅是在牛奶一词之后。还有没有办法使搜索不区分大小写


编辑:如果可能的话,我希望得到单词和数字,例如:“milk”“80”并使用python

你应该试试这个

(Milk).*?(\d+)
根据您的语言,还可以指定不区分大小写的搜索。例如,在JS:
/(Milk)。*?(\d+)/i
中,最后一个i使搜索不区分大小写


请注意,
*?
,这是最重要的部分!这是一个懒惰的迭代。换句话说,它读取任何字符,但只要它能够停止并成功处理下一条指令,它就会这样做。在这里,只要你能读懂一个数字,你就能读懂它。一个简单的
*
会返回Milk之后此行的最后一个数字,而不是这在java中似乎是可行的(我忽略了提问者想要python或者问题后来被编辑过),就像您想要:

字符串示例=
“测试40\n”+
“供人类食用的测试牛奶只能在最后一次治疗后数小时内从牛身上提取。”+
“\n人类食用的试验牛奶只能在最后一次治疗后80小时内从牛身上提取。”+
“\n人类食用的测试牛奶只能从最后一次治疗后80小时内的牛身上提取。”;
Matcher m=Pattern.compile((?i)(milk)。*?(\\d+).*\n?+).Matcher(示例);
m、 查找();
系统输出打印(m组(2)+m组(3));
看看它是如何测试单词“milk”是否以不区分大小写的方式出现在同一行中某个数字之前,并且只打印这两个数字。它还只打印第一次发现的事件(只需对给定代码稍加修改,就可以很容易地找到所有事件)

我希望它从匹配模式中提取这两种东西的方式符合您的任务

/(?<!\p{L})([Mm]ilk)(?!p{L})\D*(\d+)/
以下字符串不匹配

"The Milk is white"
"The OJ is 99"
"The milkman is 37"
"Buttermilk is 99"
"MILK is 99"
通过以自由间距模式编写正则表达式,可以使其成为自文档:

/
(?
\D*
可以替换为
*?
使匹配非贪婪。如果使用贪婪变量(
*
),则
“8milk是45或73”
的第二个捕获组将包含
“3”


要匹配“MILK is 99”,请将
([Mm]ilk)
更改为
(?i)(MILK)

尝试
MILK.*(\d+)
而这会给我数字,但不会给我文本。我需要通过在前面添加
(?i)
提取单词和数字,就像这样:
(?i)(MILK)。*?\d+
搜索单词“MILK”将不区分大小写。但它仍然返回单词milk和数字之间的任何内容,而且它也不注意两者是否在同一行中。您的意思是要将
milk 80
作为输出吗?您需要替换,
。替换(/.\b(milk)\b.*?(\d+).*/,“$1$2”)
但它不会测试多行输入中的数字和单词milk是否在同一行中。我在python中执行此操作,因此我试图将其转换为纯正则表达式实现。您可以在此处查看一下,看看我做错了什么:(删除“d+”之前的一个反斜杠)。只有在某些特定的编程语言中才需要双反斜杠,因为那里的
\
本身也是一个转义字符。不幸的是,我不能使用python,但应该可以以类似的方式实现:编译RegEx字符串,在输入中使用它,找到第一个匹配的出现并给出结果“牛奶”的捕获群和出现的数字。我搜索了一下。看起来你不能在python中的正则表达式中指定它应该不区分大小写。也许或者对你有帮助。你可以使用修饰符,但它显示了一个不推荐使用的警告。我发现解决方案使用了ignorecase标志。还修改了我需要一个新sea的事实rch every.这是我在python中的最后一个解决方案。``re.findall(r'((牛奶)。*?(\d+)?)+`,text,re.IGNORECASE)``这是一个很好的解决方案。是否可以包括一个一旦遇到周期它将停止搜索的情况?例如:“人类食用的牛奶只能从最后一次治疗后的牛身上获取。肉类可以在4天内获取。”给定的正则表达式将返回4。由于牛奶不在下一行中,我们可以让它在该期间停止,而不考虑下一行吗?
"The Milk is white"
"The OJ is 99"
"The milkman is 37"
"Buttermilk is 99"
"MILK is 99"
/
(?<!\p{L}) # the following match is not preceded by a Unicode letter
([Mm]ilk)  # match 'M' or 'm' followed by 'ilk' in capture group 2
(?!p{L})   # the preceding match is not followed by a Unicode letter
\D*        # match zero or more characters other than digits
(\d+)      # match one or more digits in capture group 2 
/x         # free-spacing regex definition mode