在下面的文字中,我尝试匹配一个数字后跟")"和数字后跟一段时间。我试图在比赛之间检索文字 示例:
" 1)有一个dsfsdfsd和2)还有另一个和另一个 情况下"
所以我想输出:["有一个dsfsdfsd和","还有另外一个",还有另一个案例"]
我使用了这个正则表达式:(?:\ d)| \ d。) 在末尾添加。*匹配整个字符串,我只希望它匹配
之间的单词也在这个字符串中:
"我们将给出4.需要另外一个选项,6.99美元是一个 比特数"
我想只匹配4.而不是6.99
任何指针都将受到赞赏。谢谢。 [R
答案 0 :(得分:1)
根据您的任务判断,匹配分隔符并使用re.split
可能更容易(正如评论中bobblebubble所指出的那样)。
我提出了一个仅仅
\d+[.)]\B\s*
匹配1位或更多位数,然后是.
或)
,然后确保后面没有单词字母(数字,字母或下划线),然后匹配零个或多个空格
import re
rx = r'\d+[.)]\B\s*'
test_str = "1) there is a dsfsdfsd and 2) there is another one and 3) yet another case\n\"we will give 4. there needs to be another option and 6.99 USD is a bit amount"
print([x for x in re.split(rx,test_str) if x])
答案 1 :(得分:1)
<强> tldr 强>
长版
正则表达式很挑剔。您最好的方法可能是以不同的方式解决问题。
例如,您的语言可能具有库函数,该函数允许您使用正则表达式拆分字符串以定义数字之间的内容。这样你就可以编写一个更简单的正则表达式来匹配数字和括号/点。
如果你仍然决定使用正则表达式,那么你需要非常有条理地构建正则表达式。很容易错过边缘案例。
所以,让我们一块一块地打破这个......
"ab 1. there is a dsfsdfsd costing $6.99 and 2) there is another one and 3. yet another case 4)5) 6)10."
"\d)|\d."
"\d\)|\d."
,它解析,但也匹配&#34; 99&#34;你可能并不期待。那是因为你忘了逃避&#34;。&#34; "\d\)|\d\."
。这不再匹配&#34; 99&#34;,但它现在匹配&#34; 0。&#34;最后而不是&#34; 10。&#34;。这是因为它假设数字只是单个数字。"\d+\)|\d+\."
"\d+\)|\d+\.(?!\d)"
"(?<=\d+\)|\d+\.(?!\d))"
"(?!"
"(?!X)."
"(?:(?!X).)*"
"(?:(?!\d+\)|\d+\.(?!\d)).)*"
"(?<=\d+\)|\d+\.(?!\d))(?:(?!\d+\)|\d+\.(?!\d)).)*"
<强>附录强>
作为使用字符串拆分函数来逃避更简单的正则表达式的示例,这是Powershell中的解决方案:
$string = 'ab 1. there is a dsfsdfsd costing $6.99 and 2) there is another one and 3. yet another case 4)5) 6)10.'
$pattern = [regex] '\d+\)|\d+\.(?!\d)'
$string -split $pattern | select-object -skip 1
答案 2 :(得分:0)
使用boolean equals(Object obj);
修饰符尝试以下正则表达式:
g
示例:https://regex101.com/r/kB1xI0/3
([A-Za-z\s\-_]+|\d(?!(\)|\.)\D)|\.\d)
自动匹配所有字母字符+空格
[A-Za-z\s\-_]+
匹配任何数字数字序列,后面没有右括号\d(?!(\)|\.)\D)
或十进制值()
)
.99
匹配任何句号后跟数字。
答案 3 :(得分:0)
我使用了这种模式:
(?<=\d.\s)(.*?)(?=\d.\s)
这将查找任何数字,任何字符和空格之间的内容。
修改:更新模式以更好地处理货币问题和行结束:
这是标志'g'
(?<=[0-9].\s)(.*?)(?=\s[0-9].\s|\n|\r)
答案 4 :(得分:0)
import re
s = "1) there is a dsfsdfsd and 2) there is another one and 3) yet another case"
s1 = "we will give 4. there needs to be another option and 6.99 USD is a bit amount"
regex = re.compile("\d\)\s.*?|\s\d\.\D.*?")
print ([x for x in regex.split(s) if x])
print regex.split(s1)
输出:
['there is a dsfsdfsd and ', 'there is another one and ', 'yet another case']
['we will give', 'there needs to be another option and 6.99 USD is a bit amount']