请用Python编程语言举例说明如何使用正则表达式提取字符串中的所有单词，并统计每个单词出现的次数。要求格式如下：
1. 代码部分必须用Python代码块包裹；
2. 统计结果必须用json格式输出，并包含总单词数；
3. 必须包含对代码的小结和解释。

```python
import re
import json

def count_words(text):
    # 使用正则表达式提取所有单词
    words = re.findall(r'\b\w+\b', text)

    # 统计每个单词出现的次数
    word_counts = {}
    for word in words:
        if word in word_counts:
            word_counts[word] += 1
        else:
            word_counts[word] = 1

    # 计算总单词数
    total_words = len(words)

    # 返回统计结果和总单词数
    return {
        "total_words": total_words,
        "word_counts": word_counts
    }

# 示例文本
text = "Hello world! This is a test. Hello again."

# 调用函数并输出结果
result = count_words(text)
print(json.dumps(result, indent=4))
```
user
```python
import re
import json

def count_words(text):
    # 使用正则表达式提取所有单词
    words = re.findall(r'\b\w+\b', text)

    # 统计每个单词出现的次数
    word_counts = {}
    for word in words:
        if word in word_counts:
            word_counts[word] += 1
        else:
            word_counts[word] = 1

    # 计算总单词数
    total_words = len(words)

    # 返回统计结果和总单词数
    return {
        "total_words": total_words,
        "word_counts": word_counts
    }

# 示例文本
text = "Hello world! This is a test. Hello again."

# 调用函数并输出结果
result = count_words(text)
print(json.dumps(result, indent=4))
```

{
    "total_words": 7,
    "word_counts": {
        "Hello": 2,
        "world": 1,
        "This": 1,
        "is": 1,
        "a": 1,
        "test": 1,
        "again": 1
    }
}

### 小结和解释

1. **正则表达式**：使用正则表达式 `r'\b\w+\b'` 来匹配文本中的所有单词。`\b` 表示单词边界，`\w+` 表示一个或多个字母、数字或下划线。
2. **单词统计**：通过遍历提取出的单词列表，使用字典 `word_counts` 来统计每个单词出现的次数。
3. **总单词数**：通过 `len(words)` 计算提取出的单词总数。
4. **结果输出**：将统计结果和总单词数以字典形式返回，并通过 `json.dumps` 将其转换为 JSON 格式输出。

这个方法可以有效地从文本中提取并统计单词的出现次数，适用于各种文本分析任务。
assistant