Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.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
Python 如何从文本匹配组中排除某些字符?_Python_Regex - Fatal编程技术网

Python 如何从文本匹配组中排除某些字符?

Python 如何从文本匹配组中排除某些字符?,python,regex,Python,Regex,我将匹配两个案例:123456-78-9或123456789。我的目标是从任何一个案例中检索123456789,即从第一个案例中排除“-”,无需提及第二个案例非常简单 我曾尝试使用类似于r“\b(\d+(?:-)?\d+(?:-)?\d)\b”,但它仍然会返回“123456-78-9” 我应该使用什么样的正则表达式?虽然我知道这需要两个步骤:1)通过正则表达式获取数字的三个部分2)使用另一行对它们进行连接,但我仍然更喜欢正则表达式,这样代码就更优雅了 谢谢你的建议 您可以将数字部分放在捕获组中,

我将匹配两个案例:123456-78-9或123456789。我的目标是从任何一个案例中检索123456789,即从第一个案例中排除“-”,无需提及第二个案例非常简单

我曾尝试使用类似于
r“\b(\d+(?:-)?\d+(?:-)?\d)\b”
,但它仍然会返回“123456-78-9”

我应该使用什么样的正则表达式?虽然我知道这需要两个步骤:1)通过正则表达式获取数字的三个部分2)使用另一行对它们进行连接,但我仍然更喜欢正则表达式,这样代码就更优雅了


谢谢你的建议

您可以将数字部分放在捕获组中,然后用捕获的组替换整个匹配

尝试以下方法:

\b(\d+)-?(\d+)-?(\d)\b
…并替换为:

\1\2\3
请注意,您使用的两个非捕获组是冗余的<代码>(?:-)?=
-?

Python示例:

import re

regex = r"\b(\d+)-?(\d+)-?(\d)\b"

test_str = ("123456-78-9\n"
            "123456789")
subst = "\\1\\2\\3"

result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)
输出:

import re

regex = r"\b(\d+)-?(\d+)-?(\d)\b"

test_str = ("123456-78-9\n"
            "123456789")
subst = "\\1\\2\\3"

result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)
123456789
123456789

.

这里最简单的方法是首先使用
re.sub
从输入中删除所有非数字字符。然后,使用相等比较检查输入:

inp = "123456-78-9"
if re.sub(r'\D', '', inp) == '123456789':
    print("MATCH")
编辑:如果我误解了您的问题,而输入可以是任何内容,并且您只想匹配给定的两种格式,那么请使用替代:

\b(?:\d{6}-\d{2}-\d|\d{9})\b
脚本:

inp = "123456-78-9"
if re.search(r'\b(?:\d{6}-\d{2}-\d|\d{9})\b', inp):
    print("MATCH")
您可以使用
r'(\d{6})(?(\d{2})\2(\d)

然后加入组1、3和4,或使用
“\\1\\3\\4”

将仅匹配这两个输入:

123456-78-9或123456789

如果需要的话,你可以给它加上边界条件


您使用的是什么编程语言?感谢您的及时回复!这里是Python。我正在探索是否可以通过一次调用re.finditer()来获得123456789,而不需要其他代码来操作捕获的组,比如concatting。因此,我不太明白如何在正则表达式中使用\1\2\3来达到这个目的?对于正则表达式的替换,您应该使用
re.Sub()
而不是
re.finditer()
。我在下面的回答中添加了一个Python示例。这假设输入的格式是正确的(可能是这样)。@AhmedAbdelhameed我不理解您的评论。如果输入类似于
--123$$45&&6-78-9
,则返回true。此外,输出可能事先未知
123456789
可能只是一个例子。但是请记住,OP是通过Python脚本实现的,用于一个只有两种类型输入的用例(阅读实际问题)。我确实读过:)OP说他们需要匹配两种情况,而不是保证输入为这两种格式之一。但我可能错了,OP可能实际上是指后者。在这一点上,我还不清楚。仅此而已:)@Cuteufo re.finditer()用于查找匹配项。它无法更改匹配项的内容。为此,您需要“查找并替换”(re.sub()就是这样做的)。通常,您不能期望“find”方法神奇地完成“find and replace”方法的工作;后者的存在是有原因的。这就是为什么我在最初的帖子中要求“排除”-,因为我使用了re.finditer()来处理我的所有案例,包括有问题的特殊案例。不管怎样,你和其他很多人都证实了这是不可能的,我想接受你的建议,改变我的路线。谢谢大家,我将选择艾哈迈德的回答作为答案。